Должно быть Parity - НЕТ
не ЧЕТ не НЕЧЕТ а НЕТ!!!!!!!!!!!!!!!
Сорян, в доке указан "нечет" а попробуйте НЕТ установить
Вид для печати
Должно быть Parity - НЕТ
не ЧЕТ не НЕЧЕТ а НЕТ!!!!!!!!!!!!!!!
Сорян, в доке указан "нечет" а попробуйте НЕТ установить
Вложение 57186
Вот скриншот с плк.
павелсиражев да ,я видел. Но в той строке, что вы выкладывали в десятичном виде, явно не хватает байт между 10-ками. Точно это ПК получает такие данные ? точно порт настроен правильно, не только в программе, но и в настройках самого порта ?
Вообще, я заметил, что если гонять программу по шагам, то буфер buf заполняется полностью (хотя также хаотично). Если программу запускать без остановок, то в буфер записывается только 8 байт, остальные остаются нулевыми. Выдержка времени увеличивает буфер, но все равно на сами данные это не влияет.
Вот окончательный вид рабочей программы .
PROGRAM PLC_PRG
VAR
port:COMSETTINGS:=(Port:=COM1,dwBaudRate:=9600,byS topBits:=0,byParity:=0,dwBufferSize:=28);
portReady:BOOL;
buf:ARRAY[0..27]OF BYTE;(*данные из весов через RS232*)
bufCopy:ARRAY[0..27]OF BYTE;
buf1:ARRAY[0..7]OF BYTE;(*массив веса*)
bufzero:ARRAY[0..27]OF BYTE:=28(0);
i:INT:=0;
i1:INT:=0;
i3:INT:=0;
dIW:DWORD:=0;
dIW2:DWORD:=0;
iWES: REAL:=0;
iSTEP:INT;
WES: REAL;(*чистый вес*)
iDEC: INT;
I4: BOOL := FALSE;
END_VAR
WHILE dIW<>500000 DO(*выдержка времени*)
dIW:=dIW+1;
END_WHILE
dIW2:=dIW2+1;
IF NOT portReady THEN(* Сразу открываем и настраиваем порт *)
portReady:=TRUE;
SysComOpen(port.Port);
SysComSetSettings(port.Port,ADR(port));
SysComRead(port.Port, ADR(buf),28,0);
ELSE(* Работаем с открытым портом *)
SysComRead(port.Port, ADR(buf),28, 0);
END_IF
bufCopy:=buf;
WHILE (i<=27)AND(i3=0)DO
IF bufCopy[i]=119 THEN
i3:=1;
FOR i1:=0 TO 7 DO
buf1[i1]:=bufCopy[i+i1+2];
END_FOR
END_IF
i:=i+1;
END_WHILE
FOR i:=0 TO 7 DO
IF buf1[i]= 46 THEN
I4:=TRUE;
iSTEP:=7-i;(*количество знаков после десятичной точки*)
iDEC:=i;(*положение десятичной точки*)
END_IF;
END_FOR;
IF i4=TRUE THEN
CASE iDEC-4 OF
2: buf1[iDEC]:=buf1[iDEC+1];
1: buf1[iDEC]:=buf1[iDEC+1];
buf1[iDEC+1]:=buf1[iDEC+2];
0: buf1[iDEC]:=buf1[iDEC+1];
buf1[iDEC+1]:=buf1[iDEC+2];
buf1[iDEC+2]:=buf1[iDEC+3];
END_CASE;
FOR i:=0 TO 6 DO
iWES:=iWES+(buf1[i]-48)*EXPT(10,(6-i));
END_FOR;
WES:=iWES/EXPT(10,iSTEP);
END_IF
i4:=FALSE;
iWES:=0;
i:=0;
i3:=0;
buf:=bufzero;
dIW:=0;
Сделал еще визуализацию для переменной WES.Проект во вложении.
Все отлично работает как часы! Всем спасибо!
В посте#4 я выложил программу с выдержкой времени по таймеру, но он никак не хочет считать. Не могу понять в чем причина? Хотелось бы , конечно сделать выдержку по таймеру, а не как я сделал через счетчик.
Вот написал простую прогу с таймером TON.
PROGRAM PLC_PRG
VAR
T1:TON;
in1:BOOL:=FALSE;
delay:TIME:=T#10000ms;
i1:INT:=0;
END_VAR
IF in1=FALSE THEN
in1:=TRUE;
i1:=0;
T1(IN:=TRUE,PT:=delay);(*запускаем таймер*)
END_IF
IF T1.Q=TRUE THEN
in1:=FALSE;
T1(IN:=FALSE,PT:=T#0s);
ELSE
i1:=i1+1;
END_IF
Почему-то таймер не считает?
Вставте строчку T1(); в тело программы.
Для правильной работы таймера, он должен быть вызван вне конструкции IF .... END_IF Вложение 57193
А таймер из поста #4, работает, если равно убрать.Вложение 57194
И кстати там он вызван вне конструкции, почему то)))
Потому, что таймер не аппаратный, а программный
Если ты этот код не вызываешь каждый цикл ПЛК, то естественно переменные внутри кода никак не изменяются.Код:FUNCTION_BLOCK TON
(*
Timer on delay.
Q is TRUE, PT milliseconds after IN had a rising edge.
*)
VAR_INPUT
IN: BOOL; (* starts timer with rising edge, resets timer with falling edge *)
PT: TIME; (* time to pass, before Q is set *)
END_VAR
VAR_OUTPUT
Q: BOOL; (* is TRUE, PT seconds after IN had a rising edge *)
ET: TIME; (* elapsed time *)
END_VAR
VAR
M: BOOL; (* internal variable *)
StartTime: TIME; (* internal variable *)
END_VAR
F (IN) THEN
IF (NOT M) THEN
(* Start Timer *)
STARTTIME := TIME();
END_IF
IF (NOT Q) THEN
(* Timer is running *)
ET := TIME() - STARTTIME;
IF (ET >= PT) THEN
Q := TRUE;
ET := PT;
END_IF
END_IF
ELSE
(* Reset everything *)
Q := FALSE;
ET := t#0s;
END_IF
M := IN;
Вложение 57215
Вот что написано в справке по кодесису, то же и в руководстве.( вложение)
Что за ерунда! Не могу понять. Вчера все работало,а сегодня уже не работает! Связи с весами нет, ничего не считывает.
Кто-нибудь знает , критично ли для ПЛК 110-220-30-Р (М02) если перепутать питание фазы с нулем? (L и N)
при чем тут питание и порт ?
Здравствуйте. Я работаю с ПЛК-110-220.30.Р-М. У него имеется 12 дискретных выходов. Но меня вводит в заблуждение то что на корпусе прибора первые четыре выхода обозначены как FDO (1-4), т.е как быстродействующие, а остальные обозначены как DO (5-12). В настройках целевой платформы у меня выбрано PLC110.30-M v2 и в конфигурации ПЛК первые 4 выхода тоже обозначены как FDO( см. скриншоты во вложении). С другой стороны в руководстве по эксплуатации re_plk110_m02__1-ru-20416-1.31.pdf в разделе технические характеристики «Дискретные выходы (контакты электромагнитных реле ПЛК110-Х.Х.Р(М02))» указано что количество релейных выходных каналов для ПЛК110-Х.30(М02) равно 12.
Помогите, пожалуйста разобраться в этой путанице.
Можно ли использовать дискретные выхода DO 1-4 (они же FDO 1-4) как обычные релейные выходы и подключать к ним нагрузку с напряжением~ 220 в? Спасибо.