Witam
Prosze spojrzeć na moj program do wysyłania ilości impulsów z licznika energii na serwer, wydaje mi się że nie działa prawidłowo...
PROGRAM PLC_PRG
VAR
oMySql : MySql_Context; (* Structure for keeping login and status informations , to kontekst logowania, komunikacji i wylogowywania*)
SQLWrite_Interval :TP:=(IN:=TRUE, PT:=T#5m); (* odmierza czas między zapisami (1 minuta) *)
SQLWrite_StartSignal :R_TRIG; (* który przez 1 cykl programu sygnalizuje początek sygnału zapisywania *)
Command :STRING(150); (* wykorzystywana do konstruowania komendy SQL *)
Energy_Command :ARRAY [0..59] OF STRING(150); (* *)
ManualLogin, ManualLogout, ManualExecute, ManualStorageClean :BOOL; (* zmienne do uruchamiania poszczególnych etapów za pomocą wizualizacji - na potrzeby testów *)
Energy_Login :BOOL; (* przechowuje sygnał rozpoczęcia logowania *)
Energy_LoginEnds :R_TRIG; (* trigger do sygnalizowania udanego zalogowania*)
Energy_Execute :BOOL; (* przechowuje sygnał rozpoczęcia wysyłania polecenia SQL *)
Energy_SQLQuery : MySql_Execute; (* przechowuje sygnał rozpoczęcia wysyłania polecenia SQL *)
Energy_ExecuteEnds :R_TRIG; (* trigger do sygnalizowania końca komunikacji z bazą SQL *)
i :BYTE; (* zmienna techniczna *)
Energy_CommandCounter :BYTE:=0; (* przechowuje informacje i ilości komend przechowywanych w TemperatureCommand *)
Energy_Logout :BOOL; (*przechowuje sygnał rozpoczęcia wylogowywania*)
Energy_SQLLogout:MySql_Logout; (*blok funkcyjny odpowiedzialny za wylogowanie z bazy*)
(*Blok funkcyjny, aby połączyć się z MySQL-Server*)
oMySqlLogin : MySql_Login;
xConnect : BOOL;
diErrorLogin : DINT;
sStatusLogin : STRING(500);
xConnected : BOOL; (* TRUE: połączenie z bazą danych, gdy zostanie ustalone *)
sHost : STRING :='xxxxxx';
uiPort : UINT :=3306;
sUser : STRING :='user';
sPWD : STRING :='xxxxxx';
sDB : STRING :='WagoDB';
sTable : STRING :='data';
(* Blok funkcyjny do przetwarzania instrukcji SQL *)
oMySqlExec1 : MySql_Execute;
xExec1 : BOOL;
diErrorExec1 : DINT;
sStatusExec1 : STRING(500);
(* Blok funkcyjny do odłączenia serwera MySQL *)
oMySqlLogout : MySql_Logout;
xDisconnect : BOOL;
diErrorLogout : DINT;
sStatusLogout : STRING(500);
Licznik_Log: CTU ; (*Licznik logowań *)
s_Table: STRING;
END_VAR
VAR_INPUT
CU: BOOL; (* Licznik w górę *)
RESET: BOOL; (* Reset licznika do 0 *)
PV: WORD; (* Limit licznika *)
CURRENT_TIME: DT;
Energy_1: WORD; (*Liczba impulsów licznika energii*)
END_VAR
VAR_OUTPUT
Q: BOOL; (* Licznik osiągnął limit *)
CV: WORD; (* Aktualna wartość licznika *)
END_VAR
VAR
M: BOOL; (* Zmienna dla CU wykrywanie krawędzi *)
END_VAR
i Program:
SQLWrite_StartSignal(CLK:=NOT SQLWrite_Interval.Q);
SQLWrite_Interval(IN:=SQLWrite_StartSignal.Q);
(* Przygotuj komendę SQL *)
IF (SQLWrite_StartSignal.Q OR ManualLogin) THEN
Command:='INSERT INTO Data (Timestamp, Energy_1) VALUES ("';
Command:=CONCAT(Command,MID(DT_TO_STRING(CURRENT_TIME),10,4));
Command:=CONCAT(Command,' ');
Command:=CONCAT(Command,RIGHT(DT_TO_STRING(CURRENT_TIME),8));
Command:=CONCAT(Command,'",');
Command:=CONCAT(Command,WORD_TO_STRING(Energy_1));
Command:=CONCAT(Command,',');
Energy_Command[Energy_CommandCounter]:=Command;
Energy_CommandCounter:=Energy_CommandCounter+1;
(* Jeśli tablica jest pełna wyzeruj licznik, zacznij zapisy od początku *)
IF Energy_CommandCounter=60 THEN
Energy_CommandCounter:=0;
END_IF;
(* Rozpocznij komunikację z Bazą SQL *)
Energy_Login:=SQLWrite_StartSignal.Q OR ManualLogin;
oMySqlLogin(sHost:=sHost, sUsername:=sUser, sPassword:=sPWD, sDatabase:=sDB,oMySql:=oMySql, xStart:=Energy_Login);
Energy_LoginEnds(CLK:=oMySqlLogin .xConnected);
Energy_Execute:=Energy_LoginEnds.Q OR ManualExecute;
Energy_SQLQuery(xStart:=Energy_Execute, oMySql:=oMySql, asSqlCommand:=Energy_Command);
Energy_ExecuteEnds(CLK:=(Energy_SQLQuery.wState=0));
(* Przy pomyślnym zapisie do Bazy SQL, wyczyść tablicę TemperatureCommand *)
IF (Energy_ExecuteEnds.Q AND (Energy_SQLQuery.diError=16#00000000)) OR ManualStorageClean THEN
Energy_CommandCounter:=0;
FOR i:=0 TO 59 BY 1 DO
Energy_Command:='';
END_FOR;
END_IF;
(* Wyloguj z Bazy SQL *)
Energy_Logout:=(Energy_ExecuteEnds.Q OR ManualLogout);
Energy_SQLLogout(xStart:= Energy_Logout, oMySql:=oMySql);
(*Licznik energii*)
(* Licznik logowań *)
Licznik_Log(CU:= Energy_Login ,RESET:=RESET , PV:= PV);
Q := Licznik_Log.Q ;
PV := Licznik_Log.CV;
END_IF
Jak coś mogę wysłać też na maila....
pozdrawiam
i z góry dzięuję za pomoc