陳力群
摘 要:本文主要介紹了解決解決供排水廠供水系統(tǒng)和DN1600引水工程系統(tǒng)報表不能顯示問題的過程。找到系統(tǒng)報表不能顯示的原因,是PLC系統(tǒng)軟件組態(tài)王的HTconverTime()時間函數(shù)本身的問題,針對問題原因通過系統(tǒng)版本升級、HTconverTime()時間函數(shù)重新定義和HTconverTime()時間函數(shù)的優(yōu)化成功解決了問題。
關(guān)鍵詞:組態(tài)王;HTconverTime()函數(shù)
引 言
我廠使用的供排水廠供水系統(tǒng)和DN1600引水工程系統(tǒng)的日報表、月報表及自定義報表就2020年1月1日后不顯示數(shù)據(jù)。通過對軟件的研究組態(tài)王6.55版本幫助的研究發(fā)現(xiàn)TConvertTime()時間函數(shù)說明中介紹函數(shù)使用范圍1970-2019年。
1、解決HTconverTime()的問題
組態(tài)王6.55版中報表處理機制,分為不同的文件,存儲在硬盤上,然后通過格林威治時間,進行管理。如果將原有的HTConvertTime()函數(shù)給替換掉,就能實現(xiàn)系統(tǒng)的正常運行。以下是報表畫面沒有數(shù)據(jù):
1.1 PLC組態(tài)王升級版本解決時間函數(shù)問題
升級組態(tài)王版本,經(jīng)過研究和咨詢組態(tài)王系統(tǒng)廠家亞控科技,確定組態(tài)王7.55sp1版解決了時間函數(shù)問題,可以提供升級服務(wù),因為我廠的應(yīng)用系統(tǒng)非亞控科技開發(fā),不保證系統(tǒng)正常使用。
為了測試新版本是否能正常運行我廠的系統(tǒng),先建立測試環(huán)境,安裝組態(tài)王7.5sp1版,然后將我廠的系統(tǒng)了安裝并接入工控網(wǎng)絡(luò)環(huán)境進行測試,系統(tǒng)不能運行。此方法不可行。
1.2重新編寫時間函數(shù)解決系統(tǒng)時間函數(shù)問題
重新定義時間函數(shù)來替代原來的時間函數(shù)來解決問題。組態(tài)王提供自定義函數(shù)的功能,在系統(tǒng)中重新定義一個時間函數(shù)。長整型long變量的取值范圍是-2147483647~+2147483647,但HTConvertTime函數(shù)按照2019年1月1日0時0分0秒,轉(zhuǎn)換出的最大值為1577721600,還未達到長整型變量的最大值,因此可以通過編寫自定義函數(shù),替換原來的時間函數(shù)。以下以HTCT命名函數(shù)代碼如下:
LONG HTCT(long YEAR,long MONTH,long DAY,long HOUR,long MINUTE,long SECOND)
{
long StartYear=1970;long StartMonth=1;long YearOfLeap=0;long YearsToDays=0;long DaysOfMonth=0;long DaysOfDay=0;long SecondNum=0;bool MarkOfLeap=0;
while(StartYear < YEAR)
{if((StartYear % 4 ==0 && StartYear % 100 !=0) || StartYear % 400 ==0)
YearOfLeap=YearOfLeap + 1;StartYear = StartYear +1;}
YearsToDays = (YEAR-1970)*365+YearOfLeap;
if((YEAR % 4 ==0 && YEAR % 100 !=0)|| YEAR % 400 ==0)
MarkOfLeap=1;while(StartMonth < Month){if(StartMonth==2)if(MarkOfLeap==1)DaysOfMonth=DaysOfMonth +29;elseDaysOfMonth=DaysOfMonth +28;else if(StartMonth==4)DaysOfMonth=DaysOfMonth +30;else if(StartMonth==6)DaysOfMonth=DaysOfMonth +30;else if(StartMonth==9)DaysOfMonth=DaysOfMonth +30;else if(StartMonth==11)DaysOfMonth=DaysOfMonth +30;elseDaysOfMonth=DaysOfMonth +31;StartMonth = StartMonth +1;} DaysOfDay =Day-1;SecondNum=(YearsToDays+DaysOfMonth+DaysOfDay)*86400+(HOUR-8)*3600+MINUTE*60+SECOND;return SecondNum;}
替換后出現(xiàn)新的問題,2020年后的報表能顯示數(shù)據(jù),以前不顯示,函數(shù)兼容性有一定的問題。
1.3優(yōu)化時間函數(shù)
重新命名NEWHTConvertTime函數(shù),內(nèi)容如下圖:
long rtnVer;
rtnVer = 0;
if(Year >= 2020) {
Year = Year - 20;
//從2000年開始計算,與2020年一樣是閏年,留20年余量
//1970年1月1日00:00到1999年12月31日23時59分59秒,是946655999
//到2019年12月31日23時59分59秒,是1577807999
rtnVer = 631152000+ HTConvertTime(Year, Month, Day, Hour, Minute, Second);
//631152000為20年的秒數(shù)
}else{
rtnVer =? HTConvertTime(Year,Month,Day,Hour,Minute,Second);
}
return rtnVer;
代碼簡單,替代函數(shù)后顯示報表正常。如下:
2 結(jié)束語
從嚴格意義上HTConvertTime時間函數(shù)問題,并不算組態(tài)王軟件錯誤,因為官方范例中,對此函數(shù)在報表文件的介紹中已經(jīng)明確只能在1970-2019年使用。通過新建時間函數(shù)并替換,最終改寫并實施最優(yōu)時間函數(shù)方案為企業(yè),解決了歷史報表和新報表的問題。
參考文獻
[1] CSDN中szq8595的2020年組態(tài)王HTConvertTime輸入?yún)?shù)錯誤問題--組態(tài)王報表2020年無法使用問題--解決方案