Показано с 1 по 4 из 4

Тема: Библиотека ModBus

  1. #1

    Angry Библиотека ModBus

    Код:
    PROGRAM PLC_PRG
    VAR
    	get1_modbus: MB_RD_HOLD_REGS;
    	t: DWORD;
    	a: WORD:=0;
    	port_opened: BYTE:=0;
    	Settings: COMSERICE.SysCom.COM_Settings;
    	SettingsEx: COMSERICE.SysCom.COM_SettingsEx;	
    	Com_service1:Com_service;
    	master1: BYTE:=1;
    	enabl: BOOL;
    	TimeOut: TIME:=T#50ms;
    	Buffer: ARRAY [0..255] of byte;
    	Complete: BOOL;
    	err: INT;
    	Exception: INT;
    	ByteCnt: WORD;
    	cmpl: BOOL;
    	x: WORD;
    	DataSize: BYTE;
    	TempWateOutMB: REAL;
    	ptr_D: POINTER TO BYTE;
    END_VAR
    Код:
    IF port_opened=0 THEN
    	Settings.sPort:=1;
    	Settings.ulBaudRate:=115200;
    	Settings.byParity:=0;
    	Settings.ulTimeOut:=0;
    	Settings.byStopBits:=0;
    	Settings.ulBufferSize:=0;
    	SettingsEx.byByteSize:=8;
    	SettingsEx.bBinary:=TRUE;
    COM_SERVICE1(Enable:=(port_opened=0), Settings:=Settings, (*sets_ex:=Setting*****) Task:=OPEN_TSK);
    END_IF
    IF COM_SERVICE1.ready THEN
    	port_opened:=2;
    END_IF
    IF port_opened=2 THEN
    get1_modbus(
    	Enable:=enabl,
    	Mode:=MB_RTU,
    	DevAddr:=1,
    	FirstAddr:=4,
    	Quantity:=2,
    	ComHandle:=Settings.sPort,
    	TimeOut:=TimeOut,
    	Buffer:=Buffer,
    	Complete=>cmpl,
    	Exception=>err,
    	ByteCnt=>DataSize);
    IF cmpl THEN
    	IF err=0 THEN
    		ptr_D:=ADR(TempWateOutMB);
    				ptr_D^:=buffer[3];
    				ptr_D:=ptr_D+1;
    				ptr_D^:=buffer[2];
    				ptr_D:=ptr_D+1;
    				ptr_D^:=buffer[1];
    				ptr_D:=ptr_D+1;
    				ptr_D^:=buffer[0];
    	END_IF
    END_IF
    IF enabl=FALSE THEN
    	enabl:=TRUE;
    END_IF
    IF err<>0 THEN
    	enabl:=FALSE;
    END_IF
    END_IF
    ПЛК 304, всегда ошибка 255 и светодиод не мигает на обмене.

  2. #2
    Пользователь Аватар для DeMax
    Регистрация
    15.08.2008
    Адрес
    Бугульма
    Сообщений
    36

    По умолчанию

    Порт СОМ1 - это Settings.sPort:=2, а у тебя Settings.sPort:=1. Попробуй поправить, должно помочь

  3. #3
    Пользователь
    Регистрация
    04.03.2014
    Адрес
    Санкт-Петербург
    Сообщений
    4

    По умолчанию

    У меня тоже похожая проблема. ПЛК 323 + ТРМ 202.
    При попытке запустить данную программу на ПЛК 323 и сменив порт на Settings.sPort:=2, она вообще зависает и снимается только по WatchDog.

    PS: ТРМ точно рабочий. Родная софтина его читает через конвертер COM=>RS-485.

  4. #4
    Пользователь Аватар для DeMax
    Регистрация
    15.08.2008
    Адрес
    Бугульма
    Сообщений
    36

    По умолчанию

    А без использования ComService работает?
    Вот небольшой фрагмент:
    2014-03-19 10-05-07 Скриншот экрана.png
    Реализация алгоблока для опроса ИВК-101
    FUNCTION_BLOCK IVK
    VAR_INPUT
    HandleWORD;
    EN:BOOL;
    END_VAR
    VAR_OUTPUT
    LINK_FLT:BOOL;
    FLOW:REAL;
    VOLUME:REAL;
    END_VAR
    VAR
    Get_Vol: MB_RD_INP_REGS;
    Get_Flow: MB_RD_INP_REGS;
    Buffer: ARRAY [0..255] OF BYTE;
    cmpl: BOOL;
    STAGE: BYTE:=0;
    err:INT;
    DataSize, X1,X2:INT;
    ptr_D, ptr_D1: POINTER TO BYTE;
    vINT;
    d,d1:REAL;
    enabl: BOOL;
    END_VAR


    IF EN = TRUE THEN
    CASE STAGE OF
    0:
    Get_Flow(
    Enable:=enabl,
    Mode:=0,
    DevAddr:=1,
    FirstAddr:=49424,
    Quantity:=2,
    ComHandle:=Handle,
    TimeOut:=T#500MS,
    Buffer:=Buffer,
    Complete=>cmpl,
    Exception=>err,
    ByteCnt=>DataSize);
    IF cmpl THEN
    IF err=0 THEN
    LINK_FLT:=FALSE;
    ptr_D:=ADR(d);
    ptr_D^:=Buffer[3];
    ptr_D:=ptr_D+1;
    ptr_D^:=Buffer[2];
    ptr_D:=ptr_D+1;
    ptr_D^:=Buffer[1];
    ptr_D:=ptr_D+1;
    ptr_D^:=Buffer[0];
    FLOW:=d*1.44;
    ELSE LINK_FLT:=TRUE;
    END_IF
    STAGE := 1;
    END_IF
    1:
    Get_Vol(
    Enable:=enabl,
    Mode:=0,
    DevAddr:=1,
    FirstAddr:=33040,
    Quantity:=4,
    ComHandle:=Handle,
    TimeOut:=T#500MS,
    Buffer:=Buffer,
    Complete=>cmpl,
    Exception=>err,
    ByteCnt=>DataSize);
    IF cmpl THEN
    IF err=0 THEN
    LINK_FLT := FALSE;
    X1:=BYTE_TO_WORD(BUFFER[1]) OR SHL(BYTE_TO_WORD(BUFFER[0]),8);
    X2:=BYTE_TO_WORD(BUFFER[3]) OR SHL(BYTE_TO_WORD(BUFFER[2]),8);
    v:=WORD_TO_DINT(X2) OR SHL(WORD_TO_DINT(X1),16);
    ptr_D1:=ADR(d1);
    ptr_D1^:=Buffer[7];
    ptr_D1:=ptr_D1+1;
    ptr_D1^:=Buffer[6];
    ptr_D1:=ptr_D1+1;
    ptr_D1^:=Buffer[5];
    ptr_D1:=ptr_D1+1;
    ptr_D1^:=Buffer[4];
    VOLUME:=DINT_TO_REAL(v)+d1;
    ELSE LINK_FLT := TRUE;
    END_IF
    STAGE := 0;
    END_IF
    END_CASE
    IF enabl = FALSE THEN
    enabl := TRUE;
    END_IF
    IF err <> 0 THEN
    enabl := FALSE;
    LINK_FLT := TRUE;
    END_IF
    END_IF

Похожие темы

  1. Modbus/TCP пример или библиотека
    от HokumOracle в разделе Помощь Разработчикам
    Ответов: 15
    Последнее сообщение: 06.02.2015, 00:14
  2. ПЛК304, библиотека modbus
    от Gvenihvivar в разделе ПЛК3хх
    Ответов: 3
    Последнее сообщение: 12.04.2013, 15:36
  3. Библиотека SysLibTime
    от Serp в разделе ПЛК1хх
    Ответов: 2
    Последнее сообщение: 01.10.2008, 16:14
  4. Собственная библиотека
    от Вячеслав В в разделе Трёп (Курилка)
    Ответов: 2
    Последнее сообщение: 28.08.2007, 16:08
  5. Библиотека ОВЕН
    от МИХАИЛ в разделе ПЛК1хх
    Ответов: 14
    Последнее сообщение: 26.04.2007, 11:55

Ваши права

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