-> Hier kostenlos registrieren
Guten Tag,
ich habe eine Spritzgussmaschine mit einem Beckhoff IPC (CX5120) darin um dort Spritzgusszyklen zu erfassen.
Pro Zyklus beschreibe ich folgende Variablen einer Struktur:
maschine: STRING(80); //maschinenname
startzeit: DT; //wann startete der zyklus
endzeit: DT; //wann endete der zyklus
channel_name: LREAL; //3 für zykluszeit
dauer: DINT; //wie viele millisekunden dauerte der zyklus
Diese Variablen schreibe ich nun nach jedem Zyklus mit dem Funktionsbaustein FB_PLCDBCmd in eine MicrosoftSQL Datenbank.
Das klappt soweit auch ganz gut und meine Datenbank füllt sich mit den entsprechenden Werten.
Nun zu meinem Problem. Die Maschine macht z.B. alle 8 Sekunden einen Zyklus und ich kann beobachten, dass die Variable bBusy des Funktionsbaustein FB_PLCDBCmd für 30 Sekunden TRUE ist.
Der Baustein ist also 30 Sekunden damit beschäftigt einen Datensatz wegzuschreiben und die Zyklen die in diesen 30 Sekunden passieren landen nicht in der Datenbank.
Ich muss also eine Art Puffer schaffen, damit wirklich jeder Zyklus in die Datenbank geschrieben wird, oder aber ich benutze den Funktionsbaustein irgendwie falsch.
Mein Code für den Funktionsbaustein der Datenbankverbindung sieht folgendermaßen aus:
Diesen Funktionsbaustein rufe ich aus meinem Hauptprogramm dann pro Zyklus folgendermaßen auf. Zudem übergebe ich die Struktur stWebinar mit meinen Variablen darin und setze den nState auf 1, damit der Baustein ausgeführt wird.
Hat jemand einen Hinweis für mich, wie ich es schaffe alle 8 Sekunden einen Wert in meine Microsoft SQL Datenbank zu schreiben? Falls ich noch wichtige Angaben vergessen haben sollte bitte melden, liefere ich dann sofort nach.
Gruß
ich habe eine Spritzgussmaschine mit einem Beckhoff IPC (CX5120) darin um dort Spritzgusszyklen zu erfassen.
Pro Zyklus beschreibe ich folgende Variablen einer Struktur:
maschine: STRING(80); //maschinenname
startzeit: DT; //wann startete der zyklus
endzeit: DT; //wann endete der zyklus
channel_name: LREAL; //3 für zykluszeit
dauer: DINT; //wie viele millisekunden dauerte der zyklus
Diese Variablen schreibe ich nun nach jedem Zyklus mit dem Funktionsbaustein FB_PLCDBCmd in eine MicrosoftSQL Datenbank.
Das klappt soweit auch ganz gut und meine Datenbank füllt sich mit den entsprechenden Werten.
Nun zu meinem Problem. Die Maschine macht z.B. alle 8 Sekunden einen Zyklus und ich kann beobachten, dass die Variable bBusy des Funktionsbaustein FB_PLCDBCmd für 30 Sekunden TRUE ist.
Der Baustein ist also 30 Sekunden damit beschäftigt einen Datensatz wegzuschreiben und die Zyklen die in diesen 30 Sekunden passieren landen nicht in der Datenbank.
Ich muss also eine Art Puffer schaffen, damit wirklich jeder Zyklus in die Datenbank geschrieben wird, oder aber ich benutze den Funktionsbaustein irgendwie falsch.
Mein Code für den Funktionsbaustein der Datenbankverbindung sieht folgendermaßen aus:
Code:
FUNCTION_BLOCK FB_DatabaseConnection2
VAR_INPUT
stWebinar : ST_Webinar; //als Input Variable oder unter die normalen?
nState : INT;
END_VAR
VAR_OUTPUT
END_VAR
VAR
fbPLCDBCmd : FB_PLCDBCmd(sNetID := '', tTimeout := T#5S);
sCmd : STRING (1000);
aPara : ARRAY[0..5] OF ST_ExpParameter;
ipTcResult : I_TcResultEvent;
sSourcePath : STRING(255);
sEventClass : WSTRING(255);
eSeverity : E_Severity;
nEventID : UDINT;
sEventText : WSTRING(255);
END_VAR
Code:
// set Parameter configuration
aPara[0].sParaName := 'index'; aPara[0].eParaType := E_ExpParameterType.Int32; aPara[0].nParaSize := 4;
aPara[1].sParaName := 'maschine'; aPara[1].eParaType := E_ExpParameterType.STRING_; aPara[1].nParaSize := 80;
aPara[2].sParaName := 'startzeit'; aPara[2].eParaType := E_ExpParameterType.DateTime; aPara[2].nParaSize := 4;
aPara[3].sParaName := 'endzeit'; aPara[3].eParaType := E_ExpParameterType.DateTime; aPara[3].nParaSize := 4;
aPara[4].sParaName := 'channel_name'; aPara[4].eParaType := E_ExpParameterType.Double64; aPara[4].nParaSize := 8;
aPara[5].sParaName := 'dauer'; aPara[5].eParaType := E_ExpParameterType.Int32; aPara[5].nParaSize := 4;
// set command
sCmd := 'INSERT INTO [dbo].[Zyklus_Test] ( [maschine], [startzeit], [endzeit], [channel_name], [dauer]) VALUES ( {maschine}, {startzeit}, {endzeit}, {channel_name}, {dauer})';
CASE nState OF
0: //Idle
;
1: //FB_PLCDBCmd
fbPLCDBCmd.Execute(
hDBID:= 1,
pExpression:= ADR(sCmd),
cbExpression:= SIZEOF(sCmd),
pData:= ADR(stWebinar),
cbData:= SIZEOF(stWebinar),
pParameter:= ADR(aPara),
cbParameter:= SIZEOF(aPara));
IF NOT fbPLCDBCmd.bBusy THEN
ipTcResult := fbPLCDBCmd.ipTcResultEvent;
IF NOT fbPLCDBCmd.bError THEN
nState := 0;
ELSE
nState := 200;
END_IF
END_IF
200: //Event State
sSourcePath := ipTcResult.SourcePath;
sEventClass := ipTcResult.EventClassDisplayName;
eSeverity := ipTcResult.Severity;
nEventID := ipTcResult.EventId;
sEventText := ipTcResult.Text;
nState := 0;
END_CASE
Diesen Funktionsbaustein rufe ich aus meinem Hauptprogramm dann pro Zyklus folgendermaßen auf. Zudem übergebe ich die Struktur stWebinar mit meinen Variablen darin und setze den nState auf 1, damit der Baustein ausgeführt wird.
Code:
fbDatabaseConnection2(stWebinar:=stWebinar, nState:= 1);
Hat jemand einen Hinweis für mich, wie ich es schaffe alle 8 Sekunden einen Wert in meine Microsoft SQL Datenbank zu schreiben? Falls ich noch wichtige Angaben vergessen haben sollte bitte melden, liefere ich dann sofort nach.
Gruß
Zuletzt bearbeitet: