PDA

Просмотр полной версии : плк110 SysComOpen



tux
26.08.2010, 08:32
Задача - связать контроллер с датчиком, у которого свой свой протокол (тупо шлет без остановки свое значение в ascii).

Контроллер: плк110-220.60Р-М
PLCInfo
PLC model MODEL PLC 110-60
Binary VERSION 2.10.7
Need Target version 2.10

Таргет: Version 2.10

Не могу открыть ни один из com портов.
Код такой:

PROGRAM PLC_PRG
VAR
hndl0:DWORD;
hndl1:DWORD;
hndl2:DWORD;
hndl3:DWORD;
hndl4:DWORD;
hndl5:DWORD;
hndl6:DWORD;
hndl7:DWORD;
hndl8:DWORD;
END_VAR

hndl0:=SysComOpen(0);
hndl1:=SysComOpen(COM1);
hndl2:=SysComOpen(COM2);
hndl3:=SysComOpen(COM3);
hndl4:=SysComOpen(COM4);
hndl5:=SysComOpen(COM5);
hndl6:=SysComOpen(COM6);
hndl7:=SysComOpen(COM7);
hndl8:=SysComOpen(COM8);

При запуске всем присваивается 4294967295 (по документации ет, наскока я понял, ошибка).

Добавил либу SysLibCom.lib

Из конфигурации делал только в PLC Configuration Universal network module, в котором RS-232, настройки вродь все выставил как положено в нем (с компа вижу данные нормально), кабелек от контроллера к датчику уже несколько раз в разных комбинациях перепаивал, результат один.

Что я еще могу делать не так?

tux
26.08.2010, 09:23
нашел на форуме описание "фишки", что перед тем, как открыть порт, его нужно на всяк случай закрыть, теперь делаю так:

SysComClose(COM1);
hndl1:=SysComOpen(COM1);

далее делаю

cs.Port:=COM1;
cs.dwBaudRate:=9600;
cs.byStopBits:=0;
cs.byParity:=0;
cs.dwTimeout:=0;
cs.dwBufferSize:=0;
cs.dwScan:=0;
pRet:=SysComSetSettings(COM1, ADR(cs));

гдето тоже тут было написано, что SysComSetSettings принимает первым параметром не хендл, а номер порта, типо так в русской документации (но у меня почемуто и в ней написано что хендл нужен), там же написано, что должно возвращать TRUE. У меня если использовать номер порта, то получаю FALSE, а если хендл (который ноль), то получаю опять все FFFF... (кстати, тоже любопытно, как оно оказывается в булевой переменной). Но в результате ни так ни так я дальше данных с помощью SysComRead прочитать немогу, возвращает всегда 0, код:
klv:=SysComRead(COM1, ADR(str), 22, 0);

Малышев Олег
26.08.2010, 10:03
Оно
http://www.owen.ru/forum/showthread.php?t=517&page=13 ???

tux
26.08.2010, 11:19
да не, вроде подключился, я так понимаю при установке false - ет нормально, данные получаю, но кривые (мусор, разной длинны), обычно такое ведь получается,когда параметры неправильно выставлены, все перепроверил, вроде норм, а мож какраз и не выставляются они, поетому и false...

tux
26.08.2010, 11:20
неа, если вообще не вызывать функцию настройки, то даже мусор не идет...

tux
26.08.2010, 12:03
взяль tx и rx на контроллере перемкнул, делаю:

buf:='12345678901234567890zx';
SysComWrite(port, ADR(buf), 22, 0);
klv:=SysComRead(port, ADR(str), 22, 0);

получаю 1-2 первых символа и мусора следом пару символов, klv показывает 1-2...

tux
26.08.2010, 12:06
хм, притом, если размер буфера ставлю в 2 символа, то получаю серавно 4, те опять 1-2 нормальных, остальное мусор

tux
26.08.2010, 13:53
чета совсем все плохо, подцепил com порт контроллера к компу, из контроллера пишу строку в него, на компе принимаю первые 2-3 символа из нее только, с чем это связанно?

tux
26.08.2010, 14:30
нашел часть проблемы, сам тупил, нечаянно инициализировал порт при каждом проходе заново, наивно думал что блок init выполняется только один раз, судя по названию, но всеравно, мусор еще идет, но уже периодически в нем проскакивают нужные данные! прогресс!

tux
27.08.2010, 13:57
Усе, допинал я его, потратил на все больше двух дней, на всяк случай, если кто столкнется с такой же проблемой (а мож и я когда подзабуду), опишу все здесь.
Весовой индикатор CI-1560A.
Код следующий:

PROGRAM PLC_PRG
VAR
port:PORTS;
hndl:DWORD;
cs:COMSETTINGS;
isSet:BOOL;
id:DWORD;
i:DWORD:=0;
pos:DWORD;
klv:DWORD;
klvAll:DWORD;
bufIn:STRING;
buf:STRING;
str:STRING;
tmpCounter:DWORD;
mass:REAL;
END_VAR

IF isSet=FALSE THEN
isSet:=TRUE;
port:=COM1;
SysComClose(port);
hndl:=SysComOpen(port);
cs.Port:=port;
cs.dwBaudRate:=9600;
cs.byStopBits:=0;
cs.byParity:=0;
cs.dwTimeout:=0;
cs.dwBufferSize:=0;
cs.dwScan:=0;
SysComSetSettings(port, ADR(cs));
id:=1;
ELSE
IF i=0 THEN
SysComWrite(port, ADR(id), 1, 0);
i:=1;
klvAll:=0;
buf:='';
ELSE
(*если за 100 проходов неполучит данных, то потерял, просим еще раз,
если число сильно маленькое, то небудет успевать прочитать все уеликом,
если большое, то будет тупить, если потеряет кусок данных*)
IF i<100 THEN
klv:=SysComRead(port, ADR(bufIn), 22, 0);
klvAll:=klvAll+klv;
buf:=CONCAT(buf, LEFT(bufIn, DWORD_TO_INT(klv)));
IF(klvAll=22) THEN (*если собрали все символы*)
(*если конец и начало строки попали в середину, нормализуем ее,
(датчик часто грешит етим)*)
IF RIGHT(buf, 2)<>'$R$N' THEN
pos:=FIND(buf, '$R$N');
str:=CONCAT(RIGHT(buf, (22-DWORD_TO_INT(pos)-1)), LEFT(buf, DWORD_TO_INT(pos)+1));
ELSE
str:=buf;
END_IF
tmpCounter:=tmpCounter+1;
mass:=STRING_TO_REAL(MID(str, 8, 10)); (*необходимые данные*)
i:=0;
ELSE
i:=i+1;
END_IF
ELSE
i:=0;
END_IF
END_IF
END_IF

Скорость - примерно 10 раз за секунду получает данные.
На самом весовом индикаторе нужно выставить:
F03 - 2
F10 - 01
F12 - 3
(кто не понял че ет, открывает мануал и чиатет его...)
Кабелек распаян так (который овеновский для прошивки КС1, оставлю тоже, тк с первого раза из трех проводов ни один правильно не припаял):
RJ12 - RS-232
TxD(1 - синий) - 3
RxD(2 - желтый) - 2
GND(6 - белый) - 7