Для использования ПЛК/ПК от 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