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

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

  1. #1

    Question Библиотека SysComLib

    Уважаемые специалисты! Помогите , пожалуйста , разобраться в проблеме, возникшей при работе с библиотекой SysLibCom .
    Занимаюсь разработкой обмена по нестандартному последовательному интерфейсу приборов с ПЛК100 в CoDeSys . Столкнулась со следующими проблемами.
    1.Не удаётся открыть порт с помощью функции SysComOpen ( выдаёт ошибку открытия порта).
    2. Функция SysComSetSettings в описании "Библиотека SysLibCom.doc" представлена возвращающей тип BYTE, а компилируется только как возвращающая BOOL.
    3. В описании параметров используемого порта в библиотеке RS-485 определяется как СОМ :=0, но указать удаётся только начиная с СОМ1, а это уже (судя по описанию) RS-232.

    PROGRAM
    VAR
    sendBuffer: ARRAY[0..31] OF BYTE; (* буфер передачи*)
    readBuffer: ARRAY[0..31] OF BYTE; (* буфер приёма*)
    Error: BYTE := 0;
    iter: INT;
    Port_stat : BYTE := 0;
    SendByte: DWORD; (* счётчик передачи *)
    ReadByte: DWORD; (* счётчик приёма *)
    PuskPort: BOOL;
    Tmr: TON; (* таймер *)
    Trata: TIME := t#0.003s; (* трата после передачи *)
    Handle: DWORD; (* дискриптор порта *)
    Settings: COMSETTINGS := (Port := COM1, dwBaudRate := 115200, byStopBits := 0, byParity := 0, dwTimeout := 0);
    END_VAR


    Error := 0;
    CASE Port_stat OF
    0:
    Handle := SysComOpen(Settings.Port);
    IF (Handle = 16#FFFFFFFF ) THEN (* порт уже открыт*)
    Error:=1;
    END_IF
    sendBuffer[0]:= 1; (* инициализация буфера передачи *)
    sendBuffer[1]:= 4;
    sendBuffer[2]:= 0;
    sendBuffer[3]:= 0;
    sendBuffer[4]:= 0;
    sendBuffer[5]:= 1;
    sendBuffer[6]:= 16#31;
    sendBuffer[7]:= 16#CA;
    FOR iter:= 0 TO 7 DO readBuffer[iter] := 0; END_FOR (* обнуление буфера приёма *)

    PuskPort := SysComSetSettings(Handle, ADR(Settings)); (* запуск порта*)
    SendByte := SysComWrite(Handle, ADR(sendBuffer[0]), 8, 0); (* передача *)
    Tmr(IN:= TRUE , PT:= Trata ); (* запуск таймера *)
    Port_stat := 1;

    1:
    Tmr(IN:= TRUE ); (*проверка таймера *)
    IF Tmr.Q = TRUE THEN
    ReadByte := SysComRead(Handle, ADR(ReadBuffer[0]), 8, 0); (* чтение порта*)
    SysComClose(Handle); (*закрыть порт*)
    Port_stat := 2;
    END_IF
    2:
    Tmr(IN:= FALSE ); подготовка к перезапуску таймера*)
    Port_stat := 0;
    END_CASE

    Буду благодарна за помощь!!!

  2. #2

    По умолчанию

    Реализация Syslibcom в ПЛК Овен отличается от стандартной .
    Для работы с RS-485 номер порта надо задавать явно:
    Handle := SysComOpen(0);.

    Указатель на порт равен номеру порта,
    при успешной настройке порта SysComSetSettings возвращает значение 0:
    PuskPort:=SysComSetSettings(int_to_dword(Settings. Port),ADR(Settings))=0; (* запуск порта*).
    SysComClose(int_to_dword(Settings.Port))(* закрытие порта*)

    Для RS-485:
    PuskPort := SysComSetSettings(0, ADR(Settings))=0; (* запуск порта*).
    SysComClose(0)(* закрытие порта*)
    Последний раз редактировалось Логвиненко Андрей; 19.10.2009 в 10:55.

  3. #3

    По умолчанию

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

Ваши права

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