Макс, попробуйте
Захват-2.png
Скрипт без изысков. Читает Input регистр 0х5, результат отображается в регистре PSW300.
Пять лишних байт учел.
Код://В примере адрес устройства равен 1 //Данные Input 0x05 будут регистре PSW300 //************************************************* BYTE snd[8]={0x01,0x04,0x00,0x05,0x00,0x01};//буфер для посылки команды slave //[0]-адрес устройства(0x01) //[1]-Код функции ModbusRTU 0x04 -чтение Input registers //[2]-ст.байт адреса начального регистра(0x00) //[3]-мл.байт адреса начального регистра(0x05) //[4]-ст.байт количества регистров(0x00) //[5]-мл.байт количества регистров(0x01) //[6]-ст.байт CRC(Определим ниже) //[7]-мл.байт CRC(Определим ниже) BYTE rcv[12];//буфер для приема ответа от slave+лишние 5 байт //[0]-адрес устройства //[1]-Код функции ModbusRTU-чтение Input registers 0x04 //[2]-счетчик байт(0x02) //[3]-мзначение регистра Hi //[4]-значение регистра Lo //[5]-ст.байт CRC //[6]-мл.байт CRC //лишние 5 байт //[7] //[8] //[9] //[10] //[11] snd[6]=HIBYTE(Crc(snd,6));//дополнить команду CRC, сначала Hi snd[7]=LOBYTE(Crc(snd,6));//затем Lo Enter(PLC);//Захватить порт PLC Send(PLC,snd,8);//Отправить команду Receive(PLC,rcv,12,1000,6);//Получить ответ (тайм-аут 1000мс) PSW[300]=MAKEWORD(rcv[4],rcv[3]); Leave(PLC);//Освободить порт


Ответить с цитированием
