Макс, попробуйте
Захват-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);//Освободить порт