PDA

Просмотр полной версии : Библиотека SysComLib



ольга
16.10.2009, 18:18
Уважаемые специалисты! Помогите , пожалуйста , разобраться в проблеме, возникшей при работе с библиотекой 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

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

Логвиненко Андрей
19.10.2009, 10:49
Реализация 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, 12:36
реализация отличается, т.к. мы руководствовались английской документацией с ошибкой. а когда документацию исправили - уже менять все было поздно.