23 марта 2010 г.

TwinCAT: Чтение/запись данных по Modbus TCP

Для использования ПЛК/ПК от BECKHOFF в качестве Modbus-клиента достаточно применить функциональные блоки 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.

3 комментария:

  1. Добрый день
    Очень надо сделать слейва модбас тсп на ВС9020. Не могу найти подходящей библиотеки. Нашол только TcModbusTcpBC.lb6 но ето походу библиотека на мастера. Прошу помщи ...

    ОтветитьУдалить
  2. Привести пример с FB_MBWriteRegs совершенно не бессмысленное занятие!
    Ничего там абсолютно идентичного нету.
    Когда делаешь это первый раз - фиг поймёшь как оно работает.
    Приведите пример FB_MBWriteRegs пожалуйста!

    ОтветитьУдалить

  3. 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

    ОтветитьУдалить