Добрый день, господа формучане!
На базе СПК110 было решено управлять лабораторным термостатом фирмы Termex из славного города Томск по RS485 интерфейсу. Так уж получилось, что данный термостат по модбасу разговаривать не хочет и не может. Покурив мануал к данному термостату, было выяснено следующее:
1. В случае подключения термостата к интерфейсу RS485 следует соблюдать настройки: паритет - нет, бодрейт - 9600, стоп-бит - 1;
2. Запрос представляет собой строку ASCII символов, начинающуюся символом ':' и заканчивающуюся символом возврата каретки (код 13) или любым другим с кодом символа менее 13. Ответ передается той же строкой.
3. Запрос передается в виде: ':160228-M ALM.STATUS RD' (по крайней мере, на данный запрос термостат должен отвечать.
Подключивши А и В контакты на RS485 интерфейсах, была написана простенькая программка с использованием библиотек SysCom и ComSerice, посылающая в порт этот запрос:
Код:
PROGRAM PLC_PRG
VAR
Settings: ComSerice.COM_Settings;
SettingsEx: ComSerice.COM_SettingsEx;
COM_SERVICE1: COM_SERVICE;
SendBuffer : STRING;
receivedData: ARRAY[0..99] OF STRING;
readBuffer: ARRAY[0..99] OF STRING;
sendByte: UDINT;
readByte: UDINT;
i:INT;
y:BYTE:=0;
Z:BYTE;
END_VAR
VAR RETAIN
readTimeout: INT:=100;
readByteNumber: INT:=50;
END_VAR
SendBuffer:= ':160228-M ALM.STATUS RD';
y:= INT_TO_BYTE(LEN(SendBuffer))+1; //Здесь добавили один символ, чтобы посылался "0" - как код символа менее 13
Settings.sPort:=3;
Settings.ulBaudrate:=9600;
Settings.byParity:=0;
Settings.ulTimeout:=0;
Settings.byStopBits:=1;
Settings.ulBufferSize:=y;
SettingsEx.byByteSize:=y;
COM_SERVICE1(Enable:=TRUE, Settings:=Settings , sets_ex:=Setting****Task:=OPEN_TSK);
sendByte:=ComSerice.SysComWrite(COM_SERVICE1.handle,ADR(sendBuffer),y,5000,0);
readByte:=ComSerice.SysComRead(COM_SERVICE1.handle,ADR(readBuffer[0]),readByteNumber,readTimeout,0);
//readByteNumber - число байт ожидаемых функцией.
//readTimeout - время ожидания данных, по истечении которого, не дождавшись readByteNumber байт,
//функция возвратит в readBuffer всё, что получила
IF readByte>0 THEN
i:=0;
WHILE readByte>0 DO
receivedData[i]:=readBuffer[i];
readByte:=readByte-1;
i:=i+1;
END_WHILE
END_IF
После заливки в СПК данной программы, стало понятно, что термостат глух к нашим мольбам и в ответ на все наши старания ничего не посылает в ответ(
В свою очередь, вместо термостата по линии 485 подключали АС4 и считывали, что же посылает наш СПК в порт с помощью монитора порта. СПК, вроде бы, посылает то, что надо... Подскажите, пожалуйста, что можно сделать с нашими руками, желательно, без советов, куда их засунуть) Что мы делаем не так, и что необходимо исправить?