1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 | FUNCTION_BLOCK NTP_Management VAR_INPUT xStart_reception: BOOL; // Commande pour l' mission uiPortClient: UINT; // Port client : 3000 par d faut uiPortServer: UINT; // Port du serveur : 123 par d faut iUtc_offset: INT; // Offset UTC de -12...14 END_VAR VAR_OUTPUT eState: CLIENT_STATE; // tape du statut du client sdtNtpDateAndTime: OSCAT_BASIC.SDT; // variable structured date and time todNtpTime: TOD; // variable heure uniquement convert du STRUCTURED DATE AND TIME fbUdpPeer: NBS.UDP_Peer; // cr ation de l'homologue UDP fbUdpReceive: NBS.UDP_Receive; // r ception des donn es UDP fbUdpSend: NBS.UDP_Send; // mission des donn es UDP dateNtpDate := OSCAT_BASIC.SDT_TO_DATE(sdtNtpDateAndTime); //Extract Date From SDT uiExtracted_year := LIMIT(1970,INT_TO_UINT(OSCAT_BASIC.YEAR_OF_DATE(dateNtpDate)),2099); uiExtracted_day := INT_TO_UINT(OSCAT_BASIC.DAY_OF_MONTH(dateNtpDate)); uiExtracted_minute := LIMIT(0,INT_TO_UINT(OSCAT_BASIC.MINUTE_OF_DT(dtNtpDateAndTime)),59); CLIENT_STATE.WAITING: // Attente des commandes ecritures sur serveur UDP fbSendTrig(CLK:=xStart_reception); IF fbSendTrig.Q THEN fbResponseTimeout(IN:=FALSE); eState := CLIENT_STATE.SEND; CLIENT_STATE.SEND: fbUdpSend ( xExecute := TRUE, hPeer := fbUdpPeer.hPeer, ipAddr := stIpServer, uiPort := uiPortServer, pData := ADR(c_abyNtpRequest), szSize := SIZEOF(c_abyNtpRequest) ); IF fbUdpSend.xDone THEN fbUdpSend(xExecute:=FALSE); eState := CLIENT_STATE.RECEIVE; ELSIF fbUdpSend.xError THEN ; //Envoi de la demande au serveur END_IF CLIENT_STATE.RECEIVE: // si des donn es sont re ues - nous r cup rons l'horodatage, nous nous attendons ce que la prochaine commande crive IF fbUdpReceive.xReady THEN wsMessage := ""; dtNtpDateAndTime := NTP_DATA_TO_DT(abyNtpResponse, 2); eState := CLIENT_STATE.WAITING; ELSIF fbUdpReceive.xError THEN ; // traitement des erreurs END_IF IF fbResponseTimeout.Q THEN END_CASE |