PDA

Просмотр полной версии : СПК+Термостат по RS485



ChemDevil
01.08.2016, 18:19
Добрый день, господа формучане!

На базе СПК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.handl e,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 и считывали, что же посылает наш СПК в порт с помощью монитора порта. СПК, вроде бы, посылает то, что надо... Подскажите, пожалуйста, что можно сделать с нашими руками, желательно, без советов, куда их засунуть) Что мы делаем не так, и что необходимо исправить?

SA104
02.08.2016, 08:03
Подключите ваш термостат к ПК и через гипертерминал пошлите в него упомянутый вами запрос - :160228-M ALM.STATUS RD
Если ответит, тогда уже свою программу копайте.
Фраза -"вроде бы посылает то, что надо .." малоинформативна )
Сравните строку запроса, наблюдаемую в мониторе порта с требуемым, если есть разница, копайте программу.

capzap
02.08.2016, 08:28
тут кажется массив строк объявлять вовсе не нужно, а то ни чего кроме как откуда руки растут не скажешь

ChemDevil
02.08.2016, 09:36
Подключите ваш термостат к ПК и через гипертерминал пошлите в него упомянутый вами запрос - :160228-M ALM.STATUS RD
Если ответит, тогда уже свою программу копайте.
Фраза -"вроде бы посылает то, что надо .." малоинформативна )
Сравните строку запроса, наблюдаемую в мониторе порта с требуемым, если есть разница, копайте программу.
Подключил через АС4 к компу, на запрос молчит( звонил в Томск, говорят, что "мы уже много лет поставляем эти термостаты, всё хорошо". У этого термостата есть ещё и юсб порт. При подключении его к компу, определяется как HID-устройство. Через программу автора ПО термостата пишу данный запрос в этот ЮСБ, термостат радостно отвечает. А вот через RS485 молчит(
Разобрал, там на вывод 485 стоит микросхема:ADM485 - маломощный передатчик сигнала по 485. Непонятно, что дальше делать: объект стоит

ChemDevil
02.08.2016, 09:36
Фраза -"вроде бы посылает то, что надо .." малоинформативна )

Посылает то, что надо)

SA104
02.08.2016, 09:56
Посылает то, что надо)
Тогда пошлите это же самое через терминал, если ваш термостат не ответит, ваша программа не при чем.

SA104
02.08.2016, 09:59
Подключил через АС4 к компу, на запрос молчит( звонил в Томск, говорят, что "мы уже много лет поставляем эти термостаты, всё хорошо". У этого термостата есть ещё и юсб порт. При подключении его к компу, определяется как HID-устройство. Через программу автора ПО термостата пишу данный запрос в этот ЮСБ, термостат радостно отвечает. А вот через RS485 молчит(
Разобрал, там на вывод 485 стоит микросхема:ADM485 - маломощный передатчик сигнала по 485. Непонятно, что дальше делать: объект стоит
А осциллограмму не смотрели непосредственно на rs485, может там вообще тишина?

ChemDevil
02.08.2016, 10:11
А осциллограмму не смотрели непосредственно на rs485, может там вообще тишина?
1. По терминалу посылали, термостат молчит. Просто до последнего не верили, что дело может быть в нём: всё-таки, Термекс достаточно известная компания на этом рынке...
2. Осциллографа, к сожалению, у нас нет)

SA104
02.08.2016, 10:19
1. По терминалу посылали, термостат молчит. Просто до последнего не верили, что дело может быть в нём: всё-таки, Термекс достаточно известная компания на этом рынке...
2. Осциллографа, к сожалению, у нас нет)
Осциллограф-главный свидетель обвинения , пока у вас лишь косвенные улики, надежда есть )
Что за адаптер использовали для проверки термостата из терминала?

ChemDevil
02.08.2016, 10:21
Осциллограф-главный свидетель обвинения , пока у вас лишь косвенные улики, надежда есть )
Что за адаптер использовали для проверки термостата из терминала?
Спасибо, Шерлок)
Адаптер: ОВЕНовский АС4

SA104
02.08.2016, 10:43
Адаптер: ОВЕНовский АС4
Попробуйте китайский "свисток" USB-RS485 для очистки совести..

ChemDevil
04.08.2016, 16:34
Итак, сегодня снова добрался до агрегата и почти победил: в терминале отвечает всё как положено. А вот в самом СПК110 возникла загвоздка: приходит, порой, всякая казябра. Поигравшись с таймаутами на чтение (60 мс) и запись (10 мс), а так же с интервалом выполнения цикла (200 мс), стал получать то, что можно увидеть на скрине ниже (очень похоже: должно быть ":160228-M 0x00 000010")

25707

У кого какие мысли: чем выпрямить мои многострадальные руки?)

Ну и действующий код


PROGRAM PLC_PRG
VAR
SendBuffer : STRING;
sendByte: UDINT;
readByte: UDINT;
RS : STRING:='0';
i:INT;
y:BYTE:=0;
Send_B:BOOL;
b_timerIN: BOOL;
b_timerOUT:BOOL;
SendPeriod:TON;
END_VAR
IF COM_SERVICE3.Ready=FALSE THEN
OpC3();(*Программа открытия порта с настройками*)
END_IF

IF COM_SERVICE3.Ready=TRUE THEN
IF Send_B=TRUE THEN
SendBuffer:= ':160228-m alm.status rd$R';
y:= INT_TO_BYTE(LEN(SendBuffer));
sendByte:=ComSerice.SysComWrite(COM_SERVICE3.handl e,ADR(sendBuffer),y,10,0);
Send_B:=FALSE;
END_IF
readByte:=ComSerice.SysComRead(COM_SERVICE3.handle ,ADR(RS[0]),30,60,0);
END_IF
SendPeriod(IN:=b_timerIN , PT:=T#500MS , Q=>b_timerOUT);(*Интервал отправки*)
IF b_timerIN=FALSE THEN
b_timerIN:=TRUE;
END_IF
IF b_timerOUT=TRUE THEN
b_timerIN:=FALSE;
Send_B:=TRUE;
END_IF

ChemDevil
04.08.2016, 20:14
Новая вводная, господа!)

1. Связь терминал-спк110 работает нормально: на терминал приходит именно то, что нужно. Считывание от СПК к терминалу тоже работает
2. Связь терминал-термостат работает нормально: на соответствующие команды от терминала термостат отвечает то, что надо.
3. Связь СПК-Термостат не работает: на спк от термостата приходит казябра, команды от спк редко воспроизводятся и воспринемаются

capzap
04.08.2016, 22:13
перефразирую третий пост в связи с нововведениями, использовать массив байт будет куда лучше чем строка