Различия
Здесь показаны различия между двумя версиями данной страницы.
Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия | ||
doc:rpsvrtcp:irregular [2013/09/09 13:30] denis [Irregular tags] |
doc:rpsvrtcp:irregular [2013/09/09 13:46] (текущий) denis [Подводный камень] |
||
---|---|---|---|
Строка 42: | Строка 42: | ||
- | После этого в самом ближайшем будущем этот флаг будет модулем, отвечающем за связь с rpsvrtcp, и передан серверу при помощи команды SETFLAG: | + | После этого в самом ближайшем будущем этот флаг будет прочитан модулем, отвечающем за связь с rpsvrtcp, и передан серверу при помощи команды SETFLAG: |
<code delphi> | <code delphi> | ||
Строка 103: | Строка 103: | ||
</code> | </code> | ||
- | А в это время в том же rpsvrtcp живет своей жизнью модуль robo: обменивается данными с ПЛК, посылая ему запросы чтения тегов типа ''requested''. При этом он следит и за тегами ''irregular'' - если у тега флаг ''tfInUse'', то посылется запрос на одиночное чтение данного тега. | + | А в это время в том же rpsvrtcp живет своей жизнью модуль robo - обменивается данными с ПЛК, посылая ему запросы чтения тегов типа ''requested''. При этом он следит и за тегами ''irregular'' - если у тега флаг ''tfInUse'', то посылется запрос на одиночное чтение данного тега. |
<code delphi> | <code delphi> | ||
Строка 165: | Строка 165: | ||
</code> | </code> | ||
- | <code delphi> | + | При установке значеня тега в ПЛК модуль robo также уделяет irr-тегам немного больше внимания, чем другим: после каждой записи robo сам устанавливает тегу флаг ''tfInUse'', чтобы новое значение обновилось: |
- | </code> | + | |
<code delphi> | <code delphi> | ||
- | </code> | + | // D:\promauto-src\Work_shd\rpsvrtcp\sources\Robo.pas |
- | <code delphi> | + | // Передача тэгов |
- | </code> | + | // writing all tags (per, req, irr) |
+ | for i:=0 to TagCount-1 do | ||
+ | begin | ||
- | <code delphi> | + | // Передача тега |
- | </code> | + | if Tags[i].GotOut then begin |
+ | if Tags[i].ValOut > $FFFF then | ||
+ | TransStr := '^' | ||
+ | else | ||
+ | TransStr := '@'; | ||
+ | TransStr := TransStr + Tags[i].Address + DecHexW(Tags[i].ValOut and $FFFF); | ||
- | <code delphi> | + | w:=0; |
- | </code> | + | if UseCRC8 then |
+ | w := GetCRC8(TransStr) | ||
+ | else | ||
+ | for k:=1 to 11 do w :=w + ord(TransStr[k]); | ||
- | <code delphi> | + | TransStr := TransStr + DecHexB(w and $FF) + #13; |
- | </code> | + | Tags[i].GotOut := false; |
+ | |||
+ | Attemp := 0; | ||
+ | repeat | ||
+ | sio_sendstring( PortHolder_Port, TransStr); | ||
+ | flag := sio_getstring( PortHolder_Port, s); | ||
+ | |||
+ | if (Tags[i].TagProp = tpIrregular) then | ||
+ | Tags[i].TagFlag := tfInUse; | ||
+ | |||
+ | |||
+ | if UseLogging then | ||
+ | LoggerSaveDayMessage( | ||
+ | inttostr(Attemp) + ': ' + | ||
+ | copy(TransStr,1,13) + '|' + s + ' ' + | ||
+ | iif(copy(TransStr,1,13) = copy(s,2,13), 'ok', 'TAG_WRITE_ERROR') ); | ||
+ | |||
+ | if (flag) and (copy(s,1,1) = '!') then | ||
+ | break; | ||
+ | |||
+ | sleep(50); | ||
+ | sio_flush( PortHolder_Port, 2 ); | ||
+ | inc(Attemp); | ||
+ | if Attemp > AttempMax then err := true; | ||
+ | until Attemp > AttempMax; | ||
+ | end; | ||
+ | end; | ||
- | <code delphi> | ||
</code> | </code> | ||
+ | ==== Подводный камень ==== | ||
+ | Очень редко случается доселе не локализованный баг - после записи в irr-теги ПЛК значения не обновляются в rpsvrtcp, но сами значения уходят в ПЛК нормально. Помогает перезапуск rpsvrtcp. | ||
- | Запрос от клиента выполняется коммандами: | ||
- | SETFLAG | ||
- | |