Просмотр полной версии : плк110 SysComOpen
Задача - связать контроллер с датчиком, у которого свой свой протокол (тупо шлет без остановки свое значение в 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, настройки вродь все выставил как положено в нем (с компа вижу данные нормально), кабелек от контроллера к датчику уже несколько раз в разных комбинациях перепаивал, результат один.
Что я еще могу делать не так?
нашел на форуме описание "фишки", что перед тем, как открыть порт, его нужно на всяк случай закрыть, теперь делаю так:
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, 09:03
Оно
http://www.owen.ru/forum/showthread.php?t=517&page=13 ???
да не, вроде подключился, я так понимаю при установке false - ет нормально, данные получаю, но кривые (мусор, разной длинны), обычно такое ведь получается,когда параметры неправильно выставлены, все перепроверил, вроде норм, а мож какраз и не выставляются они, поетому и false...
неа, если вообще не вызывать функцию настройки, то даже мусор не идет...
взяль tx и rx на контроллере перемкнул, делаю:
buf:='12345678901234567890zx';
SysComWrite(port, ADR(buf), 22, 0);
klv:=SysComRead(port, ADR(str), 22, 0);
получаю 1-2 первых символа и мусора следом пару символов, klv показывает 1-2...
хм, притом, если размер буфера ставлю в 2 символа, то получаю серавно 4, те опять 1-2 нормальных, остальное мусор
чета совсем все плохо, подцепил com порт контроллера к компу, из контроллера пишу строку в него, на компе принимаю первые 2-3 символа из нее только, с чем это связанно?
нашел часть проблемы, сам тупил, нечаянно инициализировал порт при каждом проходе заново, наивно думал что блок init выполняется только один раз, судя по названию, но всеравно, мусор еще идет, но уже периодически в нем проскакивают нужные данные! прогресс!
Усе, допинал я его, потратил на все больше двух дней, на всяк случай, если кто столкнется с такой же проблемой (а мож и я когда подзабуду), опишу все здесь.
Весовой индикатор 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
Powered by vBulletin® Version 4.2.3 Copyright © 2025 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot