PDA

Просмотр полной версии : Использование OwenNet и библиотеки SysCom



MasterDarius
05.05.2016, 16:52
Привет всем, создал эту тему потому, что пока не удаётся разобраться как пользоваться библиотекой SysCom, конечно тот, кто использовал раньше SysLibCom уже, наверно, разобрался, но я новичок, и мне с места в карьер не прыгнуть. Нужен пример, как c помощью библиотеки SysCom её функций: SysComOpen, SysComRead, SysComWrite, SysComClose считать переменную на Slave устройстве, и записать значение через интерфейс rs-485 потокол Owen ModBus. В частности, у меня Мастер - СПК107, а слейв ПЛК110-60. На форуме ничего не нашёл. Внятных примеров ни встречал. Мне нужна просто функция считал, или считал-записал. Код, передранный из Codesys 2.3, не выкладывать. Нужен рабочий пример чтения-записи именно в среде CodeSys 3.5, через выше перечисленные функции.

capzap
05.05.2016, 17:10
http://www.owen.ru/forum/showthread.php?t=23072&p=192666&viewfull=1#post192666 здесь есть

MasterDarius
05.05.2016, 18:33
А где в этом проекте настроить, открыть и закрыть порт? Я скопировал, выкинул лишнее и ничего не осталось. Естественно, ничего не работает. Ковыряюсь. Мне нужна функция на входе номер устройства и индекс(сдвиг), на выходе WORD или Read переменная. Это как раз то, про что я и говорил, примеры есть, а не выходит.

У меня через конфигуратор (устройства) всё работает, мне через библиотеки функций надо получить то же самое.

capzap
05.05.2016, 19:08
и что Вы понимаете под лишним? Первую строчку выкинули?

MasterDarius
05.05.2016, 21:12
То что красным, это ведь к чтению-записи в порт не относится:

ors(enable:=flag);

IF tik.Q THEN
state:=0;
otvet.ref:=ROR(512,8);
otvet.offset:=ROR(2,8);
otvet.crc:=_CRC(IN:=ADR(otvet), N:=6);
END_IF;
tik(IN:=ors.Done AND NOT tik.Q, PT:=T#2S);
CASE state OF
0:
bWrite:=SysComWrite(ors.Handle,ADR(otvet),SIZEOF(o tvet),TimeOut,ADR(Err));
IF bWrite = SIZEOF(otvet) THEN
state:=1;
END_IF;
1:
bRead := SysComRead(hCom:=ors.Handle,pbyBuffer:=ADR(BufBR[1]),ulSize:=8,ulTimeout:=TimeOut,pResult:=ADR(Err));

IF bRead>0 THEN
;
END_IF;
ELSE ;
END_CASE;

:rolleyes:

capzap
05.05.2016, 21:35
очень даже нужные строки кода, первое выделение это период запроса

второе выделение, это проверка что все данные отправлены и только тогда переходим к чтению ответа

ну и третье выделение, это ожидание хоть какого нибудь поступления байт из соединения, вопрос был в организации связи в этом примере всё это есть, а так вот

VAR
flag : BOOL;
bRead : UDINT;
bWrite : UDINT;
state : UINT;
ors : ComConn;
Err : SysCom.RTS_IEC_RESULT;
TimeOut : COM_Timeout :=100;
BufBR : ARRAY [1..1024] OF BYTE;
otvet : REQUEST_RHR := (adr_slave:=16,cod_fun:=3);
tik : TON;
uno : REAL;
duo : ARRAY[0..3] OF BYTE;
ptr : POINTER TO REAL;
tak : TON;
texts : STRING;
END_VAR


ors(enable:=flag);
IF tik.Q THEN
state:=0; (*в каждом запросе устанавливаем переменную на кейс отправки запроса*)
otvet.ref:=ROR(4,8); (*начальный адрес*)
otvet.offset:=ROR(2,8); (*количчество запрашиваемых регистров*)
otvet.crc:=_CRC(IN:=ADR(otvet), N:=6); (* формирование контрольной суммы для протокола модбас*)
END_IF;
tik(IN:=ors.Done AND NOT tik.Q, PT:=T#2S); (* запуск периодического запроса если соединение установлено*)
CASE state OF
0:
bWrite:=SysComWrite(ors.Handle,ADR(otvet),SIZEOF(o tvet),TimeOut,ADR(Err));
IF bWrite = SIZEOF(otvet) THEN (*здесь можно обойтись и без условия, обычно отправляется за один цикл плк*)
state:=1;
END_IF;
1:
bRead := SysComRead(hCom:=ors.Handle,pbyBuffer:=ADR(BufBR[1]),ulSize:=8,ulTimeout:=TimeOut,pResult:=ADR(Err));
IF bRead>0 THEN (* если пришли байты, собираем для получения флоата*)
duo[0]:=BufBR[7];
duo[1]:=BufBR[6];
duo[2]:=BufBR[5];
duo[3]:=BufBR[4];
ptr:=ADR(duo);
uno:=ptr^;
END_IF;
ELSE ;
END_CASE;
tak(IN:=NOT tak.Q, PT:=T#30S);
IF tak.Q THEN (*пишем в файл на флешку*)
texts:=CONCAT('echo "',REAL_TO_STRING(uno));
texts:=CONCAT(texts,';`date`" >>/mnt/ufs/media/sda1/archiv.log');
SysExecute(sys_command:=texts);
END_IF;

MasterDarius
06.05.2016, 00:50
Всё понятно. У вас уровень программирования просто недосягаемый. Начинающему программисту разобраться до конца просто не реально. Я, не то что пытаюсь что-то изменить, но хотя бы откомпилировать что есть. Я даже не могу разобраться где здесь адрес устройства, а где смещение. Жуть какая, я вообще подумал, что первая часть кода, это обрывок к какому-то таймеру относится. Может подскажете, какие библиотеки подключить чтобы хоть откомпилировать. Долго я буду вкуривать.
У меня вот что выдаёт:
24314

capzap
06.05.2016, 07:21
в моем проекте перейдите на вкладку POU, вместо вкладки Устройства и увидите не доостающие ФБ и структура. Адрес устройства у меня фиксированный и он находится в объявлениях, ищите ключевое слово adr_slave

MasterDarius
06.05.2016, 11:18
Всё понятно, я лузер. Теперь стало понятнее что к чему, однако всё же для получения хоть какого-то результата, хотелось бы просто откомпилировать ваш проект, я подключил все библиотеки, после этого он мне выдал только одну ошибку, что нет устройства, я установил таргет файл для плк30х со страницы и он мне выдал 102 ошибки
24320
все ошибки однотипные, похоже не тот таргет вы можете выложить тот старый, который вы использовали?

capzap
06.05.2016, 11:28
по моему примеру, лучше создайте свой проект с панелью и скопируйте из моего все ПОУ, структуру и библиотеки которые попросит компилятор

а по уму лучше прочитать эту тему http://www.owen.ru/forum/showthread.php?t=23897 в спойлере Скачать документ СПК. Modbus описана работа как через конфигуратор так и через разные библиотеки, Вам же модбас нужен насколько я понял

MasterDarius
06.05.2016, 14:33
Немного повозившись с подключением библиотек программа у меня откомпилировалась. Теперь пытаюсь понять что изменить, чтобы считать переменную. В коде REQUEST_RHR := (adr_slave:=2,cod_fun:=3); adr_slave - это адрес устройства, а cod_fun - это смещение? И ещё вопрос, у вас в коде переменная считывается в массив BufBR[1]? И ещё мне бы убрать запись в переменную, или лучше считать переменную по другому адресу?

capzap
06.05.2016, 14:43
cod_fun это номер функции,т.е. в примере чтение нескольких регистров
начальный адрес и количество задается в условии от первого таймера

MasterDarius
06.05.2016, 17:02
У меня похоже не компилируется функциональный блок ComConn. Вообще у меня функции ни разу не компилировались, сколько ни пробовал. Всегда приходилось создавать программу и следить за переменными. Компилятор его показывает светлым шрифтом, как-будто она не используется. Основная программа чтения ComFunk в основной код PCL_PRG добавлена.
24328 24329

capzap
06.05.2016, 17:28
библиотеки все добавлены?

MasterDarius
06.05.2016, 18:09
Да. На библиотеки не ругается.
_CRC тоже не работает
24330
Вот программа с которой всё пробую, если интересно
24331

NIMNUL
13.02.2018, 17:00
Доброго дня.
А кто-нибудь писал программу на CFC для RS232 с использованием библиотеки SysCom?
Дайте пример на прием данных или хотя бы скриншот.

capzap
13.02.2018, 17:28
Доброго дня.
А кто-нибудь писал программу на CFC для RS232 с использованием библиотеки SysCom?
Дайте пример на прием данных или хотя бы скриншот.

десятый пост этой темы не читали и не заглядывали в этот документ https://ftp.owen.ru//CoDeSys3/11_Documentation/01_SPK/SPK_Modbus_v.1.1.pdf