Proteus - посылка запроса по RS485

Подключаем наши девайсы к компьютеру. Обсуждаются: порты, протоколы, драйвера, языки программирования и т.д.
Ответить
Fireforce
Родился
Сообщения: 7
Зарегистрирован: Сб окт 31, 2015 08:12:42

Proteus - посылка запроса по RS485

Сообщение Fireforce »

Есть прибор ПРОМА-ИДМ, необходимо включить его реле по команде от внешнего микроконтроллера используя сеть RS-485. Протокол обмена - Modbus RTU. В документации на прибор
представлены описания функций и примеры запросов. В данном случае мне нужна функция 0x05 write Coil. Запрос в HEX-формате выглядит следующим образом: 01 05 00 00 FF 00 8C 3A.
Где 01-(адрес прибора - 1байт); 05-(функция - 1байт); 00 00-номер реле (2 байта(слово)); FF 00-состояние (2 байта(слово)); 8C 3A-контрольная сумма (2 байта (слово)
В поле состояние возможно два варианта: 0xFF00 или 0x0000 (вкл. или выкл. соответственно)

Программой COMPump или ModBus Tester посылаю запрос:

Request
00:07 01 05 00 00 FF 00 8C 3A

получаю ответ:

Response
00:07 01 05 00 00 FF 00 8C 3A

Прибор выполняет команду.
Связь компьютера с прибором реализована через преобразователь интерфейса USB->RS485.

В сети нашел готовый пример на PIC16F877. В нем контроллер передает через UART сообщение "Hello World!"
Через MPLAB заменил его на команду "01 05 00 00 FF 00 8C 3A"
Запускаю Proteus с моделью собранной схемы. Виртуальный контроллер через COMPIM шлет этот запрос на включение реле,
но прибор не реагирует на команду. Пробовал садится на этот COM-порт терминалом. В нем отображаются переданные данные.

После прочтения описания на стандарт RS485, я так понимаю нужно не просто передать в порт данные, а еще и предварительно формировать их в определенном формате?
Если можно простой пример кода для любого контроллера. По аналогии сам дальше попробую разобраться и построить более сложную конструкцию.

Из руководства по эксплуатации на прибор:
СпойлерНа поле адреса выделяется 1 байт – что позволяет теоретически на одной
шине данных находиться не более 255 приборов одновременно, соответственно
байт может принимать значение от 1 до 255, 0 служит для обращения ко всем сер-
верам одновременно. На практике число одновременно подключенных приборов не
более 32. Сообщения разделяются между собой паузами. По спецификации Modbus
RTU пауза составляет не менее интервала, необходимого на передачу 3 байт.
В приборах данный интервал равен 40 ms. Общее время, необходимое на
обмен запрос + ответ составляет 100ms
Кодирование передаваемых данных
Данные передаются байтами и словами (2 байта). Слова передаются
старшим байтом вперед, т.е. если передается слово 0x1234, то 0x12 в PDU идет
раньше 0x34.
Далее по тексту в поле контрольная сумма CRC16, которая служит для об-
наружения ошибок при передаче битов данных. У контрольной суммы младшее сло-
во приводится впереди, т.е. настоящая контрольная сумма перевернута (например:
0xBDCB для PC будет 0xCBBD).
Реклама
Fireforce
Родился
Сообщения: 7
Зарегистрирован: Сб окт 31, 2015 08:12:42

Re: Proteus - посылка запроса по RS485

Сообщение Fireforce »

Программу для PIC18F452 нашел:
Спойлер// Инициализация переменных
char dat[10]; // Буфер для принимаемых и передаваемых сообщений
char i,j; // Вспомогательные переменные
// Функция обработки прерывания
void interrupt(){
Rs485master_Receive(dat); // Каждый байт принимается
}
// Главный модуль программы
void main(){
long count = 0; // Счетчик опросов
PORTB = 0; // Инициализация порта В
TRISB = 0;
PORTD = 0; // Инициализация порта D
TRISD = 0;
Usart_Init(9600); // Инициализация модуля USART на скорости 9600
Delay_ms(100); // Задержка для инициализации
// Инициализация MCU как ведущего устройства
Rs485master_Init(&PORTC, 2);
dat[0] = 0xAA;
dat[1] = 0xF0;
dat[2] = 0x0F;
dat[4] = 0; // Установить начальное значение флага приема = 0
dat[5] = 0; // Установить начальное значение флага ошибки = 0
dat[6] = 0;
// Передать данные из буфера
Rs485master_Send(dat,1,160);
PIE1.RCIE = 1; // Разрешить прерывания
INTCON.PEIE = 1;// по приему байта
PIE2.TXIE = 0; // от USART (RS485)
INTCON.GIE = 1;
while (1){ // Огранизовать бесконечный цикл
count++; // Увеличить счетчик опросов
if(dat[5]){ PORTD = 0xAA;} // Если ошибка установить PORTD = 0xAA
if(dat[4]){ // Если сообщение принято:
count = 0; // Обнулить счетчик опросов
dat[4]=0;// Очистить флаг приема
j = dat[3]; // Прочесть кол-во принятых байтов
for (i = 1; i <= j; i++){// Цикл вывода данных
PORTB = dat[i-1]; // Вывести принятый байт в PORTB
}
dat[0] = dat[0]+1; // Увеличить принятый байт на единицу
Delay_ms(1); // иделать паузу на 1 мс
Rs485master_Send(dat,1,160); // и передать новый байт ведомому устройству
}
if(count > 100000){ // Если в 100000 опросах ответ не был обнаружен
PORTD++; // увеличить счетчик ошибок
count = 0; // и обнулить счетчик опросов
Rs485master_Send(dat,1,160); // Посылать новое сообщение
if (PORTD > 10) { // При посылке потерпевшей неудачу 10 раз
Rs485master_Send(dat,1,50); // послать сообщение в широковещательный адрес
PORTD = 0; // и обнулить счетчик ошибок
}
}
}
} // Конец программы
но при сборке прошивки, компилятор выдает ошибку:
СпойлерClean: Deleting intermediary and output files.
Clean: Deleted file "C:\Program Files\Microchip\Project\Test1\Test1.cce".
Clean: Done.
Executing: "C:\Program Files\HI-TECH Software\PICC\9.50\BIN\PICC.EXE" -C -E"Test1.cce" "Test1.c" -O"Test1.obj" -Zg9 -O -ASMLIST -Q -MPLAB -18F452
Error[922] : chip "18F452" not present in chipinfo file "C:\Program Files\HI-TECH Software\PICC\9.50\dat\picc.ini"
Halting build on first failure as requested.
BUILD FAILED: Sun Nov 01 01:47:49 2015
Реклама
Fireforce
Родился
Сообщения: 7
Зарегистрирован: Сб окт 31, 2015 08:12:42

Re: Proteus - посылка запроса по RS485

Сообщение Fireforce »

C программой разобрался она написана под mikroC PRO for AVR с применением библиотечных функций, для контроллера ATMEGA16. Она есть в стандартных примерах работы с RS485. А я ее под MPLAB запускал.
В Proteus все работает. В его виртуальном терминале в режиме "HEX" видны пакеты(запросы). Они идут через небольшие промежутки времени.
Посылка имеет такой вид "96 AD 81 AA 74 A9". Только почему-то в обычном режиме терминал пишет кракозябры.
Далее С помощью Virtual Serial Ports Emulator создаю мост из двух COM-портов, COM2<=>COM3.
Proteus садится на COM2, а RSsim на COM3.
RSsim - MODBUS-RTU RS-232 PLC-Simulator - программа эмулирующая сеть из 254-х приборов. Но на этот запрос ни один из приборов не отвечает.
Подскажите что изменить в программе чтобы посылка имела такой вид: 01 05 00 00 FF 00 8C 3A
Fireforce
Родился
Сообщения: 7
Зарегистрирован: Сб окт 31, 2015 08:12:42

Re: Proteus - посылка запроса по RS485

Сообщение Fireforce »

Для Atmega8 составил простую программу в CVAVR. Все заработало.

#include <mega8.h>
#include <delay.h>
#include <stdio.h>

void main(void) {
// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: Off
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud Rate: 9600

UCSRA=0x00;
UCSRB=0x08;
UCSRC=0x8E;
UBRRH=0x00;
UBRRL=0x19;

while(1) {
UDR=0x01;
delay_ms(2);
UDR=0x05;
delay_ms(2);
UDR=0x00;
delay_ms(2);
UDR=0x00;
delay_ms(2);
UDR=0xFF;
delay_ms(2);
UDR=0x00;
delay_ms(2);
UDR=0x8C;
delay_ms(2);
UDR=0x3A;
delay_ms(1000);
}
}
Реклама
Эиком - электронные компоненты и радиодетали
Ответить

Вернуться в «Интеграция с ПК»