PDA

Просмотр полной версии : СПК107 Программное изменение ID-адреса COM-порта в режиме Slave



vlalys
19.07.2017, 06:34
Добрый день! Есть задача программного задания/изменения ID-адреса порта COM2, настроенного в режиме Slave. Проблема в том, что устройства с СПК107 устанавливаются на очень удаленные объекты и включаются о общую сеть Modbus с другими устройствами, адреса которых заранее неизвестны. Существует ли возможность программного изменения адреса COM-порта, или он жестко программируется в CodeSys?

Евгений Кислов
19.07.2017, 07:03
Добрый день! Есть задача программного задания/изменения ID-адреса порта COM2, настроенного в режиме Slave. Проблема в том, что устройства с СПК107 устанавливаются на очень удаленные объекты и включаются о общую сеть Modbus с другими устройствами, адреса которых заранее неизвестны. Существует ли возможность программного изменения адреса COM-порта, или он жестко программируется в CodeSys?

Добрый день. Используйте библиотеку Modbus Slave - в ней поддержан нужный вам функционал.

vlalys
19.07.2017, 08:33
А можно поподробнее? Какой функциональный блок (или блоки) этой библиотеки используются? Переменную адреса устройства (DevAddr) я увидел только в блоке MB_SLAVE. Там она присутствует как входная переменная обращения к порту.

Евгений Кислов
19.07.2017, 08:36
А можно поподробнее? Какой функциональный блок (или блоки) этой библиотеки используются? Переменную адреса устройства (DevAddr) я увидел только в блоке MB_SLAVE. Там она присутствует как входная переменная обращения к порту.

Пример работы с библиотекой приведен в этом документе:
http://ftp.owen.ru/index.html/CoDeSys3/11_Documentation/01_SPK/SPK_Modbus_v.1.0.pdf

Все верно, блок MB_SLAVE реализует слэйв, DevAddr - это его ID. В процессе работы останавливайте блок (Enable:=FALSE), изменяйте значение DevAdrr и запускайте блок заново.

vlalys
19.07.2017, 08:44
Спасибо! Буду пробовать.

vlalys
20.07.2017, 10:05
Пример работы с библиотекой приведен в этом документе:
http://ftp.owen.ru/index.html/CoDeSys3/11_Documentation/01_SPK/SPK_Modbus_v.1.0.pdf

Все верно, блок MB_SLAVE реализует слэйв, DevAddr - это его ID. В процессе работы останавливайте блок (Enable:=FALSE), изменяйте значение DevAdrr и запускайте блок заново.

Здравствуйте, Евгений! Так и не получилось у меня разобраться, что-то я недопонимаю - в блоке MB_SLAVE нет бита останова/запуска. Т.е. я должен отключить порт битом Enable, задать в MB_SLAVE новое значение адреса, а затем снова подключить порт? Если возможно, листинг бы программы изменения адреса.

Евгений Кислов
20.07.2017, 10:13
Т.е. я должен отключить порт битом Enable, задать в MB_SLAVE новое значение адреса, а затем снова подключить порт?

Все верно, только при этом вы работаете не с портом, а со слэйвом. Попробуйте это сделать, если не получится - я подготовлю видео.

vlalys
20.07.2017, 12:02
Все верно, только при этом вы работаете не с портом, а со слэйвом. Попробуйте это сделать, если не получится - я подготовлю видео.

Я извиняюсь за свою глупость, но так и не разобрался с этим вопросом. Может мы о разном говорим? Мне надо программно изменять не адрес внешнего устройства, подключенного к порту, а ID-адрес COM-порта в режиме Slave для его опроса внешним Мастером. 32159

Евгений Кислов
20.07.2017, 12:05
Я извиняюсь за свою глупость, но так и не разобрался с этим вопросом. Может мы о разном говорим? Мне надо программно изменять не адрес внешнего устройства, подключенного к порту, а ID-адрес COM-порта в режиме Slave для его опроса внешним Мастером. 32159

Мы говорим об одном и том же. Постараюсь завтра подготовить видео.

Евгений Кислов
21.07.2017, 08:27
Как и обещал, на коленке сделал видео:

https://www.youtube.com/watch?v=3eGtH3U_EN4




PROGRAM PLC_PRG
VAR
stCom_Settings: ComSerice.SysCom.COM_Settings;
stCom_SettingsEx: ComSerice.SysCom.COM_SettingsEx;
fbComService: COM_SERVICE;
fbModbusSlave: MB_SLAVE;

bySlaveID: BYTE;
awSlaveBuffer: ARRAY [0..31] OF WORD;
xSlaveEnable: BOOL;
END_VAR



stCom_Settings.sPort := 2;
stCom_Settings.byStopBits := 1;
stCom_Settings.byParity := 0;
stCom_Settings.ulBaudrate := 115200;


stCom_SettingsEx.byByteSize := 8;

fbComService
(
Enable := TRUE,
Settings := stCom_Settings,
sets_ex := stCom_Setting****
Task := ComSerice.COM_TSK.OPEN_TSK,
Ready=> ,
handle=>
);


IF xSlaveEnable AND fbComService.Ready THEN

fbModbusSlave
(
ComHandle := fbComService.handle,
DevAddr := bySlaveID,
pBuffer := ADR(awSlaveBuffer),
BufSize := SIZEOF(awSlaveBuffer),
NewData=> ,
Error=>
);

END_IF

vlalys
21.07.2017, 10:09
Спасибо, Евгений! Отличное видео! Спасибо, все получилось!

Vasily777
06.04.2018, 10:30
Где можно взять библиотеку ComService 3.1.0?

Евгений Кислов
06.04.2018, 10:41
Где можно взять библиотеку ComService 3.1.0?

А зачем она вам? Используйте актуальную версию с сайта.