视频二区制服丝袜人妻欧美,亚洲欧美日韩中文高清WWW777 ,丰满少妇女人A毛片视频,国产成人精品日本亚洲11,亚洲国产成人手机在线电影 ,午夜福利一区二区,中文字幕乱码一区二区免费,国产精品高清一区二区不卡

      讀取PLC時間轉換為UNIX時間做網絡同步比較

      2019/10/14 16:08:50 人評論 次瀏覽 分類:PLC應用  文章地址:http://www.fg316.com/tech/2738.html

      最近在安全行業里做讀取PLC內部故障事件分析的工作,發現在PLC網絡里采用NTP時間同步基本上沒有,因為在工控領域PLC更多承擔業務層面控制需求的實現,反而對于PLC本身的安全并沒有過多的重視。

      多區域內PLC時間同步就是安全設置的必要一步,因為這個會涉及PLC內部的事件和記錄是否能夠按照真實的時間進行提取和分析。那在不同網段讀取不同廠商PLC時間進行比較和同步就成為一個比較麻煩的事情。不同廠商PLC的日期和時間比較需要用到一個INT數組數據來比較。所以才有了這需求打算采用Unix 時間來做時間對比,因為所有廠商的PLC的日期和時間都可以轉成Unix時間。


      什么是Unix時間?
      Unix時間(英文為Unix epoch, Unix time, POSIX time或Unix timestamp)是從1970年1月1日(UTC/GMT的午夜)開始所經過的秒數,不考慮閏秒。UNIX時間的0按照ISO 8601規范為:1970-01-01T00:00:00Z。一個小時表示為UNIX時間格式為:3600秒;一天表示為UNIX時間為86400秒,閏秒不計算。

      時間                    秒

      1分鐘                  60秒

      1小時                  3600秒
      1天                     86400秒
      1周                     604800秒
      1月(30.44天)       2629743秒
      1年(365.24天)     31556926 秒


      下面將采用結構化文本的形式來開發這個PLC時間轉成Unix時間,為了方便大家在其他的PLC中實現時間格式的轉換。
      // Convert system time to unix time
      // (seconds until 1970-01-01 00:00)
      // Create by jiansiting
       
      FUNCTION Unixtime : DWORD
       
      VAR_INPUT
      END_VAR
       
      VAR_TEMP
      leapyears:INT;
      days_from_1970  : DINT;
      days_from_BeginOfYear : ARRAY[1..12] OF INT;
      l_unixtime:DINT;
      sfc1_ret_val:INT;
      CDT_systemtime:DATE_AND_TIME;
      systemtime AT CDT_systemtime : STRUCT
          year_CDT:BYTE; // 1970 ... 2038
          month_CDT:BYTE;
          day_CDT:BYTE;
          hour_CDT:BYTE;
          minute_CDT:BYTE;
          second_CDT:BYTE;
      END_STRUCT;
       
      year:INT; // 1970 ... 2038
      month:INT;
      day:INT;
      hour:INT;
      minute:INT;
      second:INT;
      END_VAR
       
      leapyears:= 0;
      days_from_1970  := 0;
       
      // days of current month without leap day
       
      days_from_BeginOfYear[1]  :=   0;  
      days_from_BeginOfYear[2]  :=  31;  
      days_from_BeginOfYear[3]  :=  59;  
      days_from_BeginOfYear[4]  :=  90;  
      days_from_BeginOfYear[5]  := 120;  
      days_from_BeginOfYear[6]  := 151;  
      days_from_BeginOfYear[7]  := 181;  
      days_from_BeginOfYear[8]  := 212;  
      days_from_BeginOfYear[9]  := 243;  
      days_from_BeginOfYear[10] := 273;  
      days_from_BeginOfYear[11] := 304;  
      days_from_BeginOfYear[12] := 334;  
       
      // read system time
      sfc1_ret_val:= READ_CLK(CDT := CDT_systemtime);
      year:= BCD_TO_INT(systemtime.year_CDT) + 2000;
      month:= BCD_TO_INT(systemtime.month_CDT);                       
      day:= BCD_TO_INT(systemtime.day_CDT);
      hour:= BCD_TO_INT(systemtime.hour_CDT);
      minute:= BCD_TO_INT(systemtime.minute_CDT);
      second:= BCD_TO_INT(systemtime.second_CDT);
       
      // sum of leap years since 1979 (without current leap year)
      leapyears := ((year-1)-1968)/4-((year-1)-1900)/100+((year-1)-1600)/400;
      days_from_1970 := (year-1970)*365 + leapyears+ days_from_BeginOfYear[month] + day-1;
       
      IF ( (month > 2) AND ((year MOD 4 = 0) AND ((year MOD 100 <> 0) OR (year MOD 400 = 0))) ) THEN
          days_from_1970 := days_from_1970 + 1; // + leap day, if year is leap year
      END_IF;
       
      // OUTPUT in s
      l_unixtime :=  second + 60 * ( minute + 60 * (hour + 24 * days_from_1970) );
       
       
      // if error return 0
      IF  sfc1_ret_val <> 0 THEN
          Unixtime := 0;
      ELSE      
          Unixtime := DINT_TO_DWORD(l_unixtime);
      END_IF;
       
      END_FUNCTION
      者:劍思庭

      共有訪客發表了評論 網友評論

        客戶姓名:
      郵箱或QQ:
      驗證碼: 看不清楚?