Различия

Здесь показаны различия между двумя версиями данной страницы.

Ссылка на это сравнение

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
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 
-  ​ 
doc/rpsvrtcp/irregular.1378719051.txt.gz · Последние изменения: 2013/09/09 13:30 — denis
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0