- Beiträge
- 5.686
- Reaktionspunkte
- 1.615
-> Hier kostenlos registrieren
Hi zusammen
Ich habe mir mal einen Kommunikationsbaustein geschrieben für die 1500er bzw mit kleinen Aenderungen für die 1200er.
Das funktioniert eigentlich ganz okay. Da man aber einen Variant übergeben muss habe ich keine möglichkeit da irgendwie rauszukriegen um welche DB Nummer es sich handelt. Die bräuchte ich aber um einen Peek Poke drauf zu machen. um mit einen Watchdogzähler einzubauen.
Hat jemand eine IDEE wie ich aus dem Variant irgendwie rausbekomme welcher DB da angeschlossen ist? Ggf noch wie lange ebenjener ist? Auch wenn er nicht aus einem PLC-Typ abgeleitet wurde und auch nicht zwingend ein Array ist?
mfG René
Ich habe mir mal einen Kommunikationsbaustein geschrieben für die 1500er bzw mit kleinen Aenderungen für die 1200er.
Code:
FUNCTION_BLOCK "SendReciveOverTCP_1500"TITLE = 'Kommunikationsbaustein'
{ S7_Optimized_Access := 'FALSE' }
AUTHOR : VoR
FAMILY : TUV
NAME : KLP
VERSION : 1.1
// Dieser Baustein bietet den Server an.
// Passt zum Baustein MasterCom mit BSEND/RECV
//
// 1.0 Erste Version
// 1.1 Korrigierte Version um empfangszyklus zu messen
VAR_OUTPUT
zykl : Time;
WD : Bool;
END_VAR
VAR_IN_OUT
Configuration {OriginalPartName := 'TCON_IP_v4'; LibVersion := '1.0'} : TCON_IP_v4;
DB_1_Recv : Variant; // DB der von AS nach LST geht
DB_1_Send : Variant; // DB der von LST nach AS geht
END_VAR
VAR
save_status_Put : Word;
save_status_Get : Word;
Zeit_alt : Time;
SEND_Instance {OriginalPartName := 'TSENDC'; LibVersion := '3.0'} : TSEND_C;
RCV_Instance {OriginalPartName := 'TRCVC'; LibVersion := '3.0'} : TRCV_C;
WD_TIMER {OriginalPartName := 'IEC_TIMER'; LibVersion := '1.0'} : TON_TIME;
Send_Reset {OriginalPartName := 'IEC_TIMER'; LibVersion := '1.0'} : TON_TIME;
END_VAR
VAR_TEMP
Zeit : Time;
len : Word;
END_VAR
BEGIN
#len := 0;
// Watchdog bearbeiten
#WD_TIMER(IN := NOT #RCV_Instance.DONE
,PT := t#5s);
#WD := #WD_TIMER.Q; // OUT: BOOL
#Zeit := TIME_TCK(); // Zeile muss für 1200er entfernt werden.
IF #RCV_Instance.DONE THEN
#zykl := #Zeit - #Zeit_alt;
#Zeit_alt := #Zeit;
END_IF;
#SEND_Instance(CONT:=TRUE,
LEN:=#len,
CONNECT:=#Configuration,
DATA:=#DB_1_Send);
#SEND_Instance.REQ := TRUE;
IF #SEND_Instance.ERROR OR #SEND_Instance.DONE OR #Send_Reset.Q THEN
#SEND_Instance.REQ := False;
END_IF;
IF #SEND_Instance.ERROR THEN
#save_status_Put := #SEND_Instance.STATUS;
END_IF;
#Send_Reset(IN:=#SEND_Instance.REQ,
PT:=t#10s);
#RCV_Instance(EN_R:=TRUE,
CONT:=1,
LEN:=#len,
CONNECT:=#Configuration,
DATA:=#DB_1_Recv);
IF #RCV_Instance.ERROR THEN
#save_status_Get := #RCV_Instance.STATUS;
END_IF;
END_FUNCTION_BLOCK
Das funktioniert eigentlich ganz okay. Da man aber einen Variant übergeben muss habe ich keine möglichkeit da irgendwie rauszukriegen um welche DB Nummer es sich handelt. Die bräuchte ich aber um einen Peek Poke drauf zu machen. um mit einen Watchdogzähler einzubauen.
Hat jemand eine IDEE wie ich aus dem Variant irgendwie rausbekomme welcher DB da angeschlossen ist? Ggf noch wie lange ebenjener ist? Auch wenn er nicht aus einem PLC-Typ abgeleitet wurde und auch nicht zwingend ein Array ist?
mfG René