PDA

Просмотр полной версии : Связь между ПЛК-100 и счетчиков US800



MaxZav
28.01.2022, 03:12
Доброго времени суток!
Хочу рассказать о том, как пришлось мне решать задачу по подключению к ПЛК-100 счетчика US800
Начал я с того, что скачал инструкцию с сайта, изучил и начал писать программу для связи контроллера с счетчиком.
К моему сожалению ничего не вышло, плк абсолютно не хотела связываться, в режиме диагностики счетчика это отображается, тогда я решил написать письмо разработчикам, которые уверили, что я все делаю правильно и еще раз выслали мне эту же инструкцию. После нескольких попыток, я скачал программу с сайта Flowmeters и через переходник RS-485-USB подключил, запустил программу, она заработала. Тогда, при помощи программы сканирования последовательного порта проверил , что приходит на порт. И к моему удивлению я увидел, что на прибор отсылаются абсолютно другие команды. Я скопировал их, разобрал, и понял, что работаю они по протоколу совместимые с ADAM-4017, ICPDAS I-7017. инструкция тоже лежит на сайте изготовителя. И опять же они указали ее не до конца, для корректной работы она должна иметь вид #092BE$0D$0A, где после формирования слова обязательно ставится команда $0D$0A. #092BE- сама команда, она без труда рассчитывается на шестнадцатиричном калькуляторе и таблице с примером в инструкции. Да, и качественное физическое соединение тоже имеет большой фактор, я не мог получить ответ, хотя счетчик якобы принимал/отправлял команды

MaxZav
28.01.2022, 09:08
Вопросов нет, просто я описал кратко как справился с задачей считывания данных с US-800.

MaxZav
31.01.2022, 07:11
Образец программы для получения мгновенного расхода и счетчика накопленного объема по каналу №1 адрес прибора 9, протестировал на ПЛК-100, ПЛК-110, работает стабильно
dlina:=LEN(COMANDA);
IF RS485ISOK THEN
IF WAITFORANSWER THEN
PT:=GetByte (0);
STR:=RBDATA_TO_STRING(PT);
RS485DATA:=CONCAT(RS485DATA,STR);
I:=I+1;
IF I > 14 THEN
WAITFORANSWER:=FALSE;
I:=0;
END_IF;
ELSE
IF dlina>0 THEN
SetByte(0,comanda , Dlina);
WAITFORANSWER:=TRUE;
END_IF;
END_IF;
ELSE
a:=LockDevice(0);
IF a=1 THEN
RS485ISOK:=TRUE;
END_IF;
END_IF;
X1:=FIND(RS485DATA, '$R');
x2:=MID(rs485DATA,8, X1-8);
x3:=MID(X2, 5,2);
IF LEN(X3)>0 THEN
X4:= STRING_TO_REAL(X3);

END_IF;
IF LEN(RS485DATA)>78 THEN
RS485DATA:='';
WAITFORANSWER:=FALSE;
END_IF;

IF ZAPROSVOL= TRUE THEN
CASE STAT OF
0:
COMANDA:='#092BE$0D$0A';
IF COMANDA= '#092BE$0D$0A' AND X4<> 0 THEN
VOLUME1:=X4*100;
STAT:= 1;
ELSE
STAT:=0;
END_IF;
1:
COMANDA:='#093BF$0D$0A';
IF COMANDA='#093BF$0D$0A' AND X4<> 0 THEN
VOLUME2:=X4/1000;
ELSE
STAT:=1;
END_IF
END_CASE;
VOLUME:= VOLUME1+VOLUME2; (*Счетчик накопленного объема*)
X4:=0;
END_IF;

IF ZAPROSQ= TRUE THEN
COMANDA:='#090BC$0D$0A';
IF COMANDA= '#090BC$0D$0A' THEN
Q:=X4; (*Мгновенный расход*)
END_IF;
X4:=0;
END_IF;