Для использования ПЛК/ПК от BECKHOFF в качестве Modbus-клиента достаточно применить функциональные блоки
Для удобства назначения регистров, обычно нагружаю функциональный блок 50-ю двойными словами. Если потребуется отправить больше — объявляю и вызываю дополнительный экземпляр, увеличив смещение начального адреса
(*Объявление функциональных блоков*)
Приводить пример с блоком
FB_MBReadRegs
и FB_MBWriteRegs
(библиотека TcModbusSrv.lib
), выполняющие 3-ю и 16-ю функции соответственно. Один экземпляр любого из блоков способен обрабатывать не более 125 регистров или, иначе говоря, 62 двойных слова (DWORD
, или DINT
).Для удобства назначения регистров, обычно нагружаю функциональный блок 50-ю двойными словами. Если потребуется отправить больше — объявляю и вызываю дополнительный экземпляр, увеличив смещение начального адреса
nMBAddr
на значение, равное 100 регистрам, и т.д. Пример вызова пары таких блоков для чтения 100 переменных типа DINT
приведён ниже.(*Объявление функциональных блоков*)
PROGRAM MAIN
VAR
fbMdbRead_1: FB_MBReadRegs;
arrRdData_1: ARRAY [1..50] OF DINT;
fbMdbRead_2: FB_MBReadRegs;
arrRdData_2: ARRAY [51..100] OF DINT;
sIP: STRING := '192.168.1.95';
iPort: UINT := 502;
END_VAR
(*Чтение 1-50 двойных слов*)
fbMdbRead_1(
sIPAddr := sIP; (*Адрес сервера*)
nTCPPort := iPort, (*Порт Modbus TCP*)
nUnitID := 16#FF, (*ID сетевого устройства, по умолчанию 16#FF*)
nQuantity := 100, (*Количество регистров WORD чтения/записи*)
nMBAddr := 0, (*Смещение адреса*)
cbLength := 200, (*Количество байт чтения/записи = nQuantity*2*)
pDestAddr := ADR(arrRdData_1), (*Адрес буфера данных для чтения/записи*)
bExecute := TRUE, (*Активация блока*)
tTimeout := t#1s, (*Таймаут*)
bBUSY => ,
bError => ,
nErrId => );
(*Чтение 51-100 двойных слов*)
fbMdbRead_2(
sIPAddr := sIP,
nTCPPort := iPort,
nUnitID := 16#FF,
nQuantity := 100,
nMBAddr := 100,
cbLength := 200,
pDestAddr := ADR(arrRdData_2),
bExecute := TRUE,
tTimeout := t#1s,
bBUSY => ,
bError => ,
nErrId => );
Приводить пример с блоком
FB_MBWriteRegs
считаю занятием совершенно бессмысленным, поскольку он абсолютно идентичен FB_MBReadRegs
. Кстати, кроме них в TcModbusSrv.lib
есть также блок FB_MBReadWriteRegs
, выполняющий 23-ю функцию (чтение и запись), работа с ним также элементарна. Для того чтобы всё это благополучно работало на целевой платформе — необходимо на стадии комплектации оборудования заказать лицензию на TwinCat Modbus TCP Server
.
Добрый день
ОтветитьУдалитьОчень надо сделать слейва модбас тсп на ВС9020. Не могу найти подходящей библиотеки. Нашол только TcModbusTcpBC.lb6 но ето походу библиотека на мастера. Прошу помщи ...
Привести пример с FB_MBWriteRegs совершенно не бессмысленное занятие!
ОтветитьУдалитьНичего там абсолютно идентичного нету.
Когда делаешь это первый раз - фиг поймёшь как оно работает.
Приведите пример FB_MBWriteRegs пожалуйста!
ОтветитьУдалитьsIP1: STRING := '192.168.1.223';
iPort1: UINT := 5030;
Unit_slaveID : BYTE := 1;
fbMdbWrite_1: FB_MBWriteRegs;
bWriteRegs1: BOOL;
MBregister_to_write : WORD := 10900;
wStarFloorContactorCMD_mb: WORD;
countwrites: USINT;
IF NOT bWriteRegs1 THEN
bWriteRegs1 :=TRUE;
fbMdbWrite_1(
sIPAddr := sIP1,
nTCPPort := iPort1,
nUnitID := Unit_slaveID,
nQuantity := 1,
nMBAddr := MBregister_to_write,
cbLength := SIZEOF(wStarFloorContactorCMD_mb),
pSrcAddr := ADR(wStarFloorContactorCMD_mb),
bExecute := TRUE,
tTimeout := t#1s,
bBUSY => ,
bError => ,
nErrId =>
);
ELSE
IF NOT fbMdbWrite_1.bBUSY THEN
bWriteRegs1 :=FALSE;
countwrites := countwrites + 1;
END_IF
fbMdbWrite_1(bExecute:=FALSE);
END_IF