Страница 1 из 3 123 ПоследняяПоследняя
Показано с 1 по 10 из 21

Тема: ПЛК304 + ModBus.compiled-library

  1. #1

    По умолчанию ПЛК304 + ModBus.compiled-library

    Здравствуйте господа и дамы, прошу поделится рабочим примером работы с библиотекой ModBus. Пытаюсь осуществить связь с ТРМ201 по протоколу ModBusRtu. Первый раз мне повезло и соединение было установлено, но затем снова появилась ошибка 255, увеличение таймаута не помогло. Может быть кто-нибудь укажет мне на ошибку, которую я найти не могу.
    Код программы следующий:

    PROGRAM PLC_PRG
    VAR
    GetTemp: ModBus.MB_RD_HOLD_REGS; (*функция 03 - чтение параметра типа INT*)
    Connection1: ComConn; (*Функциональные блок открытия порта*)
    Buffer: ARRAY[0..255] OF BYTE; (*байтовый буфер данных *)
    ConnectionClose: ComClose; (*Функциональный блок закрытия последовательного порта*)
    cmpl: BOOL;
    DataSize: WORD;
    x: WORD;
    TimeOut: ModBus.SysCom.COM_Timeout;
    Err: INT;
    Timer1:ton;
    b:BOOL;
    name: DWORD;
    h: SysFile.RTS_IEC_RESULT;
    FileHandle : SysFile.RTS_IEC_HANDLE;
    TextTest: STRING:='';
    TextTest1: STRING:='/mnt/usb1/';
    TextTest2: STRING:='ar1';
    t: INT:=1;
    END_VAR
    VAR_INPUT
    END_VAR


    //Если порт закрыт, то откроем его
    IF Connection1.done = FALSE THEN
    Connection1(enable:=TRUE, PortNum:=2);
    //Открываем первый физический порт
    //Все остальные настройки порта оставляем по умолчанию
    IF Connection1.Done=TRUE THEN
    ModBus.SysCom.SysComPurge (Connection1.Handle); //очищаем буфер порта
    TimeOut:=0; // Время для функций read write
    END_IF
    END_IF

    //blinker.TIMEHIGH:=T#5S;
    //blinker.TIMELOW:=T#1S;
    //blinker(ENABLE:=TRUE);

    //rtrig(CLK:=blinker.OUT);

    IF (Connection1.Done=TRUE) THEN
    GetTemp(
    Enable:=1 , (*разрешение работы блока *)
    Mode:=MB_RTU , (*режим передачи*)
    DevAddr:=1 , (*адрес*)
    FirstAddr:=1 , (*номер регистра*)
    Quantity:=1, (*количество регистров*)
    ComHandle:=Connection1.Handle, (*номер COM-порта*)
    TimeOut:=T#50MS , (*Таймаут T#50ms*)
    Buffer:=Buffer , (*буфер данных *)
    Complete=>cmpl , (*скопировать признак завершения операции *)
    Exception=>err , (*скопировать регистр ошибок *)
    ByteCnt=>DataSize ); (*кол-во считанных байтов *)
    END_IF;

    //если установлен признак завершения операции, то
    IF cmpl THEN
    IF err=0 THEN (*Если нет ошибок, то получаем данные из буфера типа INT*)
    x:=BYTE_TO_WORD(BUFFER[1]) OR SHL(BYTE_TO_WORD(BUFFER[0]),8);
    test:=x/INT_TO_REAL(10);
    END_IF
    END_IF

    Функциональный блок ComConn:
    FUNCTION_BLOCK ComConn
    VAR_INPUT
    Enable: BOOL; (*Разрешение работы блока*)
    PortNum: ModBus.SysCom.COM_Ports:=2; (*Номер порта на ПЛК, на ПЛК 304 это порт 2*)
    PortBaudrate: ModBus.SysCom.COM_Baudrate:=19200; (*Скорость работы порта, по умолчанию 19.2 кбод*)
    PortParity: ModBus.SysCom.COM_Parity:=0; (*Режим проверки на четнось: 0-нет; 1- нечет; 2- чет,
    по умолчанию нет проверки на четность*)
    PortStopBits: ModBus.SysCom.COM_StopBits:=0; (*Количество стоп-бит: 1- 1 бит; 2- 1.5 бита; 3- 2 бита,
    по умолчанию 1 стоп-бит*)
    PortByteSyze: BYTE:=8; (*Размер посылки в байтах*)
    END_VAR
    VAR_OUTPUT
    Handle: ModBus.SysCom.RTS_IEC_HANDLE; (*Идентификатор открытого порта, если ошибка, то все F*)
    Done: BOOL:=FALSE; (*Флаг завершения операции*)
    ErrCode: ModBus.SysCom.RTS_IEC_RESULT; (*Код ошибок*)
    END_VAR
    VAR
    Settings: ModBus.SysCom.COM_Settings; (*Настройки порта*)
    SettingsEX: Modbus.SysCom.COM_SettingsEx; (*Расширенные настройки порта*)
    Result: ModBus.SysCom.RTS_IEC_RESULT; (**)
    Rtrig: ModBus.R_TRIG;
    Trig: rs;
    END_VAR

    Rtrig(clk:=(Enable AND NOT done));
    Trig(set:=Rtrig.q, RESET1:=FALSE);
    IF Trig.Q1 THEN
    Settings.sPort:= PortNum; (*Инициализируем номер порта*)
    Settings.ulBaudrate:= PortBaudrate; (*Инициализируем скорость работы порта*)
    Settings.byParity:= PortParity; (*Настройка проверки четности порта*)
    Settings.ulTimeout:=0;
    Settings.byParity:= PortStopBits; (*Настройка количества стоп-бит*)
    Settings.ulBufferSize:= 0; (*Размер буфера*)
    SettingsEx.byByteSize:= PortByteSyze; (*Размер посылки данных*)
    SettingsEx.bBinary := TRUE;
    SettingsEx.bDtrControl := FALSE;
    SettingsEx.bRtsControl := FALSE;
    SettingsEx.bOutxCtsFlow := FALSE;
    SettingsEx.bOutxDsrFlow := FALSE;
    SettingsEx.bDsrSensitivity := FALSE;
    //Переходим непосредственно к открытию порта
    Handle:=ModBus.SysCom.SysComOpen2(ADR(Settings),AD R(SettingsEx),ADR(ErrCode));

    //Если порт открыт, то переходим к приему передачи данных
    IF (Handle<>16#FFFFFFFF) THEN
    //Если условие не выполняется, то порт занят
    Done:= TRUE;
    Trig(RESET1:=TRUE);
    ELSE
    Done:=FALSE;
    END_IF
    END_IF

    P.S. Пример, приложенный на диске с контроллером, не работает .
    Последний раз редактировалось Jumo; 02.12.2011 в 07:02.

  2. #2

    По умолчанию

    Как я тебя понимаю!!!!!! Тоже уже два дня сижу, а результата ноль!!! ПОМОГИТЕ КТО ЗНАЕТ!!!

  3. #3

    По умолчанию

    У меня такая прога:

    PROGRAM PLC_PRG
    VAR
    get1_modbus: MB_RD_HOLD_REGS; (*функция 03 - чтение параметра типа INT*)
    get2_modbus: MB_RD_INP_REGS; (*функция 04 - чтение трех параметров типа INT*)

    Buffer: ARRAY[0..255] OF BYTE; (* байтовый буфер данных *)
    cmpl: BOOL;
    port_opened: BYTE := 0;
    Init: BOOL; (* признак инициализации пользовательской программы *)
    Settings:modbus.SysCom.COM_Settings;(* настройки последовательного порта *)
    com_num: modbus.SysCom.COM_Ports:=2; (*2 - RS-485, 3,4,5 - RS-232*)
    enabl: BOOL; (*состояние работы блока*)
    err: INT; (*номер ошибки*)
    TimeOut: TIME:=T#100mS;(*таймаут*)
    Exception: BYTE;
    DataSize: WORD;
    master1: BYTE:= 1;


    x:WORD; (*считанное значение*)
    x1: WORD; (*считанное значение*)
    x2: WORD; (*считанное значение*)
    x3: WORD; (*считанное значение*)


    COM_SERVICE1: COM_SERVICE;

    END_VAR

    (*Устанавливаем настройки COM-порта*)
    IF port_opened=0 THEN
    Settings.sPort:=com_num; (*номер COM-порта*)
    Settings.ulBaudrate:=9600; (*скорость*)
    Settings.byParity:=0;
    Settings.ulTimeout:=0;
    Settings.byStopBits:=1;
    Settings.ulBufferSize:=0;
    END_IF

    COM_SERVICE1(Enable:=(port_opened=0) , Settings:=Settings , Task:=OPEN_TSK );
    (*Если COM-порт открыт, то переходим к приему и передачи данных *)
    IF COM_SERVICE1.ready THEN
    port_opened:=2;
    END_IF

    IF port_opened=2 THEN (*Удачно проинициализировали*)

    CASE master1 OF

    0: (* функция 03 инт - ФБ считывает значение параметра типа int из прибора с адресом 2 в регистр с номером 8 по протоколу Modbus-ASCII*)
    get1_modbus(
    Enable:=enabl , (* разрешение работы блока *)
    Mode:=MB_RTU , (*режим передачи*)
    DevAddr:=1 , (*адрес*)
    FirstAddr:=1 , (*номер регистра*)
    Quantity:=1, (*количество регистров*)
    ComHandle:=Settings.sPort ,(*номер COM-порта*)
    TimeOut:=TimeOut , (*Таймаут T#50ms*)
    Buffer:=Buffer , (* буфер данных *)
    Complete=>cmpl , (* скопировать признак завершения операции *)
    Exception=>err , (* скопировать регистр ошибок *)
    ByteCnt=>DataSize ); (*кол-во считанных байтов *)
    (*если установлен признак завершения операции, то *)
    IF cmpl THEN
    IF err=0 THEN (*Если нет ошибок, то получаем данные из буфера типа INT*)
    x:=BYTE_TO_WORD(BUFFER[1]) OR SHL(BYTE_TO_WORD(BUFFER[0]),8);
    END_IF
    master1:=1; (*переходим к выполнению следующего ФБ*)
    END_IF

    1: (* функция 04 инт - ФБ считывает значения трех параметров типа Int из прибора с адресом 2 начиная с регистра с номeром 12*)
    get2_modbus(
    Enable:= enabl, (* разрешение работы блока *)
    Mode:=MB_RTU , (*режим передачи*)
    DevAddr:=1 , (*адрес*)
    FirstAddr:=0 , (*номер регистра*)
    Quantity:=3 , (*количество регистров*)
    ComHandle:= Settings.sPort,(*номер COM-порта*)
    TimeOut:=TimeOut , (*Таймаут T#50ms*)
    Buffer:=Buffer , (* буфер данных *)
    Complete=>cmpl , (* скопировать признак завершения операции *)
    Exception=>err , (* скопировать регистр ошибок *)
    ByteCnt=> DataSize); (*кол-во считанных байтов *)
    (*если установлен признак завершения операции, то *)
    IF cmpl THEN
    IF err=0 THEN (*Если нет ошибок, то получаем данные из буфера типа INT*)
    x1:=BYTE_TO_WORD(BUFFER[1]) OR SHL(BYTE_TO_WORD(BUFFER[0]),8);
    x2:=BYTE_TO_WORD(BUFFER[5]) OR SHL(BYTE_TO_WORD(BUFFER[4]),8);
    x3:=BYTE_TO_WORD(BUFFER[9]) OR SHL(BYTE_TO_WORD(BUFFER[8]),8);
    END_IF
    master1:=0;(*переходим к выполнению следующего ФБ*)
    END_IF
    END_CASE

    IF enabl = FALSE THEN
    enabl := TRUE;
    END_IF

    IF err <> 0 THEN
    enabl := FALSE;
    END_IF

    END_IF

  4. #4

    По умолчанию

    А если указываю порт Р2,Р3,Р4 то библиотека вообще перестает работать!!

  5. #5

    По умолчанию

    ComHandle:= Settings.sPort,(*номер COM-порта*)

    Здесь у них ошибка, это не номер порта, это его идентификатор.
    Один раз у меня библиотека заработала, затем перестала. Пока еще не выяснил причину.

  6. #6

    По умолчанию

    Подключаю к ПЛК110 по RS485 либо по RS232 никакого результата, АС4-м читаю без проблем.

  7. #7

    По умолчанию

    COM_SERVICE1(Enable:=(port_opened=0) , Settings:=Settings , Task:=OPEN_TSK );
    При использовании этого блока, порт у меня открывался не с первого раза, поэтому я от него отказался.

  8. #8

    По умолчанию

    Подождем ответа модератора, может быть скажет что-нибудь вразумительное. Есть подозрения что библиотека для работы с modbus глючная.

  9. #9

    По умолчанию

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

  10. #10

    По умолчанию

    Повезло, мне пришлось ручками все делать. А внутри функционального блока modbus попробуй исправить номер порта на его идентификатор, возможно поможет, у меня в первый раз все заработало, но после сброса контроллера обмен данными прекратился.

Страница 1 из 3 123 ПоследняяПоследняя

Похожие темы

  1. RS-485 на ПЛК304
    от Jumo в разделе ПЛК3хх
    Ответов: 13
    Последнее сообщение: 16.10.2013, 10:53
  2. ComService.compiled-library
    от GeLeX в разделе СПК2хх
    Ответов: 4
    Последнее сообщение: 30.09.2013, 10:08
  3. ПЛК304
    от Pixelcom в разделе ПЛК3хх
    Ответов: 3
    Последнее сообщение: 09.09.2011, 16:39
  4. Linux в ПЛК304
    от Ling-Ling в разделе ПЛК3хх
    Ответов: 6
    Последнее сообщение: 20.05.2011, 01:14

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •