Сообщение от
capzap
да пока не зачто, если возникнут проблемы выкладывайте проект с тестированием слейва, подскажу что не так
Здравствуйте, не стал создавать новую тему, а решил продолжить свою старую так как, в принципе название подходит.
Начал делать новый проект: таже связка ПЛК110+ОРСсервер(Инсат)+МастерСкада. Уж очень не хочется в ручную вбивать 600-700 регистров в конфигураторе и решил разобраться с бибкой SysLibSockets.
Подогнали мне пример:
раздел описания:
Код:
FUNCTION_BLOCK SENSOR
VAR CONSTANT
TIMEOUT_TIME : TIME := T#5S ;
POLLING_TIME : TIME := T#10S ;
TRUST_TIME : TIME := T#15S ;
END_VAR
VAR_INPUT
IP1 : DWORD := 16#0A000665;
IP2 : DWORD ;
END_VAR
VAR_OUTPUT
SKY : UINT ;
SUN : UINT ;
TRUST : BOOL ;
END_VAR
VAR
STATE : INT := 0 ;
TIMEOUT_TIMER : TON ;
TRUST_TIMER : TOF ;
SOCKET : DINT :=SOCKET_INVALID ;
SADR : SOCKADDRESS ;
REQUEST : ARRAY [0..11] OF BYTE := 5(0) , 6 , 1 , 3 , 0 , 0 , 0 , 2 ;
ANSWER : ARRAY [0..12] OF BYTE ;
_IP2 : BOOL ;
END_VAR
код FB:
Код:
IF IP1 <> 0 THEN
CASE STATE OF
0:
SOCKET := SysSockCreate ( SOCKET_AF_INET , SOCKET_STREAM , SOCKET_IPPROTO_TCP ) ;
IF SOCKET <> SOCKET_INVALID THEN
STATE := 1 ;
ELSE STATE:=4;
END_IF
TIMEOUT_TIMER ( IN := TRUE , PT := TIMEOUT_TIME ) ;
1:
SADR.sin_addr := IP1;(*SEL ( _IP2 AND ( IP2 <> 0 ) , IP1 , IP2 ) ;*)
SADR.sin_family := SOCKET_AF_INET ;
SADR.sin_port := 502 ;
SysSockConnect ( SOCKET , ADR ( SADR ) , SIZEOF ( SADR ) ) ;
STATE := 2 ;
2:
IF SysSockSend ( SOCKET , ADR ( REQUEST ) , SIZEOF ( REQUEST ) , 0 ) = SIZEOF ( REQUEST ) THEN
STATE := 3 ;
ELSE
TIMEOUT_TIMER ( IN := TRUE ) ;
END_IF
3:
IF SysSockRecv ( SOCKET , ADR ( ANSWER ) , SIZEOF ( ANSWER ) , 0 ) <> 0 THEN
IF ( ANSWER [ 0 ] = REQUEST [ 0 ] ) AND ( ANSWER [ 1 ] = REQUEST [ 1 ] ) THEN
SKY := WORD_OF_BYTE ( ANSWER [ 9 ] , ANSWER [ 10 ] ) ;
SUN := WORD_OF_BYTE ( ANSWER [ 11 ] , ANSWER [ 12 ] ) ;
TRUST_TIMER ( IN := TRUE ) ;
_IP2 := FALSE ;
END_IF
STATE := 4 ;
ELSE
TIMEOUT_TIMER ( IN := TRUE ) ;
END_IF
4:
SysSockClose ( SOCKET ) ;
SOCKET := SOCKET_INVALID ;
IF REQUEST [ 1 ] = BYTE#16#FF THEN
REQUEST [ 0 ] := REQUEST [ 0 ] + 1 ;
END_IF
REQUEST [ 1 ] := REQUEST [ 1 ] + 1 ;
STATE := SEL ( TIMEOUT_TIMER.Q , 5 , 0 ) ;
TIMEOUT_TIMER ( IN := FALSE ) ;
5:
TIMEOUT_TIMER ( IN := TRUE , PT := POLLING_TIME ) ;
IF TIMEOUT_TIMER.Q THEN
TIMEOUT_TIMER ( IN := FALSE ) ;
STATE := 0 ;
END_IF
END_CASE
IF TIMEOUT_TIMER.Q THEN
STATE := 4 ;
_IP2 := NOT _IP2 ;
END_IF
ELSIF SOCKET <> SOCKET_INVALID THEN
SysSockClose ( SOCKET ) ;
SOCKET := SOCKET_INVALID ;
STATE := 0 ;
END_IF
TRUST_TIMER ( IN := FALSE , PT := TRUST_TIME ) ;
TRUST := TRUST_TIMER.Q ;
И появились вопросы:
1. ІР-адрес 10.0.6.101 будет 16#0A000665. Правильно???
2. Если этот код не переходит на 3 шаг кейса, значит нет ответа от ПК с OPC-cервером(в моем случае это 10.0.6.101)??????
3. На третьем шаге (если правильно понял)идет чтение переменных, а как тогда записать значение переменной в OPC-сервер?????
4. Вообще насколько этот код подходит для ПЛК110+ОРСсервер(Инсат), может нужно что-то переделать?????
Сразу извиняюсь за тупые вопросы - это мое первое знакомство с SysLibSockets....