Просмотр полной версии : СПК107 Программное изменение ID-адреса COM-порта в режиме Slave
Добрый день! Есть задача программного задания/изменения ID-адреса порта COM2, настроенного в режиме Slave. Проблема в том, что устройства с СПК107 устанавливаются на очень удаленные объекты и включаются о общую сеть Modbus с другими устройствами, адреса которых заранее неизвестны. Существует ли возможность программного изменения адреса COM-порта, или он жестко программируется в CodeSys?
Евгений Кислов
19.07.2017, 07:03
Добрый день! Есть задача программного задания/изменения ID-адреса порта COM2, настроенного в режиме Slave. Проблема в том, что устройства с СПК107 устанавливаются на очень удаленные объекты и включаются о общую сеть Modbus с другими устройствами, адреса которых заранее неизвестны. Существует ли возможность программного изменения адреса COM-порта, или он жестко программируется в CodeSys?
Добрый день. Используйте библиотеку Modbus Slave - в ней поддержан нужный вам функционал.
А можно поподробнее? Какой функциональный блок (или блоки) этой библиотеки используются? Переменную адреса устройства (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 и запускайте блок заново.
Пример работы с библиотекой приведен в этом документе:
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 новое значение адреса, а затем снова подключить порт?
Все верно, только при этом вы работаете не с портом, а со слэйвом. Попробуйте это сделать, если не получится - я подготовлю видео.
Все верно, только при этом вы работаете не с портом, а со слэйвом. Попробуйте это сделать, если не получится - я подготовлю видео.
Я извиняюсь за свою глупость, но так и не разобрался с этим вопросом. Может мы о разном говорим? Мне надо программно изменять не адрес внешнего устройства, подключенного к порту, а 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
Спасибо, Евгений! Отличное видео! Спасибо, все получилось!
Vasily777
06.04.2018, 10:30
Где можно взять библиотеку ComService 3.1.0?
Евгений Кислов
06.04.2018, 10:41
Где можно взять библиотеку ComService 3.1.0?
А зачем она вам? Используйте актуальную версию с сайта.
Powered by vBulletin® Version 4.2.3 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot