王毅璇,封成玉,王 皓
(華北計(jì)算機(jī)系統(tǒng)工程研究所,北京 100083)
工業(yè)控制系統(tǒng)已廣泛應(yīng)用于國(guó)家能源領(lǐng)域及民生領(lǐng)域,隨著信息技術(shù)和網(wǎng)絡(luò)技術(shù)的發(fā)展以及“工業(yè)4.0”的深入,工控系統(tǒng)網(wǎng)絡(luò)安全事件不斷發(fā)生,其安全問(wèn)題已經(jīng)影響到生產(chǎn)安全、工業(yè)穩(wěn)定以及國(guó)家的戰(zhàn)略安全[1-3]。作為工業(yè)控制系統(tǒng)監(jiān)控層級(jí)的上位機(jī)專用軟件,監(jiān)控組態(tài)軟件(Supervisory Control and Data Acquisition,SCADA)用于數(shù)據(jù)采集與過(guò)程控制[4],其可靠性和穩(wěn)定性對(duì)于工控系統(tǒng)安全至關(guān)重要。本文介紹的監(jiān)控組態(tài)軟件,用于國(guó)產(chǎn)基于可信計(jì)算[5]的密碼機(jī)制的PLC(增加了密碼模塊硬件,分配專屬公鑰和私鑰,支持冗余),采用跨平臺(tái)、分布式C/S架構(gòu)設(shè)計(jì),具備雙機(jī)雙網(wǎng)熱備冗余機(jī)制,可運(yùn)行于國(guó)產(chǎn)計(jì)算機(jī)和Linux操作系統(tǒng)上,支持Windows操作系統(tǒng),實(shí)現(xiàn)了開發(fā)及運(yùn)行環(huán)境的雙國(guó)產(chǎn)化,安全可控。
PLC數(shù)據(jù)驅(qū)動(dòng)系統(tǒng)位于監(jiān)控組態(tài)軟件的底層,即網(wǎng)絡(luò)層,是上位機(jī)監(jiān)控組態(tài)軟件與PLC的通信接口,作為監(jiān)控組態(tài)軟件的內(nèi)部數(shù)據(jù)源,要求安全可靠且常年不間斷連續(xù)運(yùn)行,具有高度的穩(wěn)定性、擴(kuò)展性和強(qiáng)大的數(shù)據(jù)采集能力。系統(tǒng)基于國(guó)產(chǎn)可信PLC和密碼設(shè)備,通過(guò)采用安全認(rèn)證、建立安全通道及采用基于密碼機(jī)制的數(shù)據(jù)傳輸方法,實(shí)現(xiàn)了通信過(guò)程的強(qiáng)安全、高可信,符合內(nèi)生安全的主動(dòng)防御工控安全體系架構(gòu)的設(shè)計(jì)思想。本文針對(duì)系統(tǒng)的實(shí)現(xiàn),首先對(duì)系統(tǒng)進(jìn)行功能分析,然后進(jìn)行了系統(tǒng)總體設(shè)計(jì),最后對(duì)系統(tǒng)與PLC通信的實(shí)現(xiàn)方式、方法進(jìn)行較為詳細(xì)的闡述。
PLC數(shù)據(jù)驅(qū)動(dòng)系統(tǒng)主要實(shí)現(xiàn)上位機(jī)監(jiān)控組態(tài)軟件與PLC的數(shù)據(jù)交互,采用以太網(wǎng)有線的方式與PLC進(jìn)行數(shù)據(jù)通信,通過(guò)PLC實(shí)現(xiàn)對(duì)現(xiàn)場(chǎng)設(shè)備的實(shí)時(shí)運(yùn)行數(shù)據(jù)的采集,并按上層應(yīng)用的組態(tài)邏輯,下發(fā)指令數(shù)據(jù)到PLC,以實(shí)現(xiàn)對(duì)設(shè)備運(yùn)行的調(diào)節(jié)和控制。系統(tǒng)分為上傳、下行輸出兩個(gè)部分。上傳部分負(fù)責(zé)從PLC中采集加密的源數(shù)據(jù),并進(jìn)行數(shù)據(jù)解密和協(xié)議解析;下行輸出部分負(fù)責(zé)對(duì)上位機(jī)下發(fā)到PLC的數(shù)據(jù)進(jìn)行協(xié)議封包、數(shù)據(jù)加密并輸出到PLC。
系統(tǒng)從PLC中采集的數(shù)據(jù)分為四類:模擬量輸入(遙測(cè),即AI)、數(shù)字量輸入(遙信,即DI)、模擬量輸出(遙調(diào),即AO)和數(shù)字量輸出(遙控,即DO),同時(shí)支持多個(gè)PLC和批量數(shù)據(jù)的采集。成批采集的數(shù)據(jù)中包括實(shí)時(shí)值和時(shí)間戳。采用組態(tài)設(shè)定的周期向PLC請(qǐng)求數(shù)據(jù),周期設(shè)定的范圍為50 ms~1 s。協(xié)議解析功能封裝為動(dòng)態(tài)執(zhí)行庫(kù),采用自定義協(xié)議,同時(shí)可支持Modbus協(xié)議、OPC協(xié)議等通信協(xié)議的解析。采用插件式設(shè)計(jì)思想,每種協(xié)議采用獨(dú)立的庫(kù),靈活可擴(kuò)展。經(jīng)系統(tǒng)解析后的采集數(shù)據(jù)放置于內(nèi)存的緩沖區(qū),并與上一周期的數(shù)據(jù)緩沖區(qū)中的數(shù)據(jù)進(jìn)行比較,如有變化則將變更的數(shù)據(jù)集放入軟件共享內(nèi)存的數(shù)據(jù)處理隊(duì)列中,由軟件數(shù)據(jù)處理分系統(tǒng)進(jìn)行處理。
監(jiān)控組態(tài)軟件將需要下發(fā)的遙調(diào)、遙控等控制指令數(shù)據(jù)放入軟件內(nèi)存中的發(fā)送隊(duì)列,數(shù)據(jù)驅(qū)動(dòng)系統(tǒng)從發(fā)送隊(duì)列中取出指令數(shù)據(jù)加密后將其發(fā)送到對(duì)應(yīng)的PLC,由PLC進(jìn)行解密處理,然后按PLC中下裝的控制邏輯實(shí)現(xiàn)對(duì)被控設(shè)備的調(diào)控。系統(tǒng)具備PLC狀態(tài)診斷功能,即周期檢測(cè)冗余PLC的主從狀態(tài),采集的數(shù)據(jù)和下發(fā)的指令數(shù)據(jù)僅針對(duì)主PLC。另外狀態(tài)診斷功能以周期發(fā)心跳的形式與軟件的任務(wù)管理進(jìn)程通信,將當(dāng)前進(jìn)程的運(yùn)行狀態(tài)發(fā)送給軟件任務(wù)管理系統(tǒng),并監(jiān)控對(duì)應(yīng)的PLC通信接口工作狀態(tài),在發(fā)生故障時(shí)發(fā)出報(bào)警,并將與PLC通信過(guò)程的調(diào)試記錄、通信速率、傳輸字節(jié)數(shù)等信息記錄在軟件日志文件中。
PLC數(shù)據(jù)驅(qū)動(dòng)系統(tǒng)利用基于可信算法的密碼機(jī)制與密碼設(shè)備實(shí)現(xiàn)與PLC通信的安全可信。在整個(gè)PLC控制系統(tǒng)的人員、上位機(jī)、下位機(jī)分別增加三種安全相關(guān)物理設(shè)備:人員密鑰、設(shè)備密鑰、嵌入式加密芯片,其中密鑰信息作為各自身份的唯一識(shí)別,即私鑰。通過(guò)權(quán)限管理軟件,配置系統(tǒng)內(nèi)部的權(quán)限對(duì)應(yīng)關(guān)系:不同操作人員的權(quán)限、上下位機(jī)之間的對(duì)應(yīng)關(guān)系等,并生成到白名單文件中。系統(tǒng)拓?fù)浣Y(jié)構(gòu)如圖1所示。
圖1 系統(tǒng)拓?fù)浣Y(jié)構(gòu)
系統(tǒng)主要包含三個(gè)子模塊:組態(tài)模塊、上位機(jī)密鑰服務(wù)模塊和通信主模塊。組態(tài)模塊用于PLC配置,為管理界面的動(dòng)態(tài)鏈接庫(kù),在軟件中是一個(gè)獨(dú)立的調(diào)用模塊,通過(guò)顯示的管理界面,可以對(duì)控制系統(tǒng)中的PLC進(jìn)行配置和設(shè)定,為通信模塊提供必要的參數(shù)信息;上位機(jī)密鑰服務(wù)模塊作為獨(dú)立運(yùn)行的進(jìn)程,以庫(kù)的形式封裝基于可信計(jì)算方法的校驗(yàn)、加解密等服務(wù)的接口,供通信模塊和組態(tài)模塊調(diào)用;通信主模塊在與PLC建立安全通道后,從歷史主站周期向PLC請(qǐng)求數(shù)據(jù),接收PLC傳來(lái)的數(shù)據(jù),并將下發(fā)的操作指令數(shù)據(jù)寫入目標(biāo)PLC,實(shí)現(xiàn)與PLC通信相關(guān)的業(yè)務(wù)邏輯功能。
監(jiān)控組態(tài)軟件與PLC通信流程如圖2所示。監(jiān)控組態(tài)軟件在通過(guò)安全性校驗(yàn)并登錄后,根據(jù)白名單,將用戶密鑰和上位機(jī)密鑰進(jìn)行相互身份鑒別的校驗(yàn),校驗(yàn)通過(guò)后調(diào)用PLC數(shù)據(jù)驅(qū)動(dòng)系統(tǒng)進(jìn)程。進(jìn)程運(yùn)行后,根據(jù)IP地址取出PLC對(duì)應(yīng)的密鑰標(biāo)示值,與PLC做上下位機(jī)驗(yàn)簽的安全校驗(yàn),校驗(yàn)通過(guò)后給PLC下發(fā)登錄請(qǐng)求包,在登錄成功后建立與PLC通信的安全通道,開始收發(fā)數(shù)據(jù)包。下發(fā)數(shù)據(jù)包在進(jìn)行數(shù)據(jù)加密后被發(fā)送到PLC。校驗(yàn)運(yùn)算及數(shù)據(jù)包加解密是通過(guò)調(diào)用上位機(jī)密鑰服務(wù)進(jìn)程完成的,該進(jìn)程封裝了基于可信計(jì)算的密鑰校驗(yàn)算法,由軟件啟動(dòng)。下位機(jī)PLC的安全密鑰服務(wù)程序被下裝到PLC中CPU單獨(dú)的核中獨(dú)立運(yùn)行,完成驗(yàn)簽、加解密功能,實(shí)現(xiàn)了運(yùn)行與監(jiān)控相隔離。
圖2 監(jiān)控組態(tài)軟件與PLC通信流程
基于安全的冗余機(jī)制,系統(tǒng)中只有歷史主站可以與PLC主站通信,軟件下發(fā)的控制指令數(shù)據(jù)只能通過(guò)歷史主站下發(fā)到PLC主站,下發(fā)的數(shù)據(jù)由操作員站或者歷史站具有下發(fā)權(quán)限(同時(shí)具備與下發(fā)匹配的用戶權(quán)限和人員私鑰)的人員進(jìn)行操作產(chǎn)生。上傳的數(shù)據(jù)首先由軟件歷史主站調(diào)用上位機(jī)密鑰服務(wù)模塊的解密接口返回源數(shù)據(jù),然后將源數(shù)據(jù)轉(zhuǎn)換為熟數(shù)據(jù)后,通過(guò)軟件的站間數(shù)據(jù)通信系統(tǒng)進(jìn)行內(nèi)存實(shí)時(shí)數(shù)據(jù)的同步操作,實(shí)現(xiàn)數(shù)據(jù)在歷史主站、從站及操作員站間的同步。
系統(tǒng)進(jìn)程根據(jù)組態(tài)模塊對(duì)下位機(jī)PLC的配置設(shè)定情況及監(jiān)控組態(tài)軟件中變量定義模塊輸出的采集變量表,以不同的周期采集對(duì)應(yīng)PLC的數(shù)據(jù),數(shù)據(jù)驅(qū)動(dòng)系統(tǒng)對(duì)上傳的數(shù)據(jù)進(jìn)行解密和協(xié)議解析,根據(jù)相應(yīng)PLC的采集變量表,找到數(shù)據(jù)值對(duì)應(yīng)的監(jiān)控軟件中變量點(diǎn)的全局ID號(hào),將下位機(jī)原始數(shù)據(jù)進(jìn)行加工,轉(zhuǎn)換為軟件熟數(shù)據(jù),放入軟件內(nèi)存中的數(shù)據(jù)緩沖區(qū)。
PLC數(shù)據(jù)驅(qū)動(dòng)系統(tǒng)的工作模式分為主從兩種,與PLC進(jìn)行通信在系統(tǒng)主模式下進(jìn)行,采用TCP方式,系統(tǒng)通信模塊為客戶方,PLC為監(jiān)聽方。通信模塊采用線程的方式與多PLC進(jìn)行連接,多PLC采用主從模式,僅每對(duì)PLC中的主站與系統(tǒng)通信模塊連接。系統(tǒng)根據(jù)每對(duì)PLC的運(yùn)算周期,周期向PLC的主站發(fā)送數(shù)據(jù)請(qǐng)求,PLC的運(yùn)算周期通過(guò)單獨(dú)的邏輯組態(tài)軟件進(jìn)行配置,每個(gè)PLC的運(yùn)算周期可配置成不同,單位為ms。PLC主站每50 ms檢查是否有新的數(shù)據(jù)請(qǐng)求,一旦收到請(qǐng)求,立即將本PLC的所有上傳數(shù)據(jù)封裝為數(shù)據(jù)包,調(diào)用下位機(jī)密鑰服務(wù)的加密接口進(jìn)行數(shù)據(jù)加密后進(jìn)行回發(fā)。一個(gè)回發(fā)數(shù)據(jù)包最大可以是10 KB,可上傳本PLC中的所有上傳數(shù)據(jù),一旦發(fā)生一個(gè)包無(wú)法承載所有數(shù)據(jù)的情況,則PLC自動(dòng)采用分包方式,將數(shù)據(jù)拆分后分批上傳給系統(tǒng)通信主模塊,每個(gè)分包發(fā)送間隔為10 ms。
上位機(jī)如有操作指令需要下發(fā),無(wú)論是在操作員站還是歷史從站,下發(fā)指令數(shù)據(jù)包只會(huì)傳到歷史主站,由歷史主站調(diào)用上位機(jī)密鑰服務(wù)的加密接口進(jìn)行數(shù)據(jù)加密后,再下發(fā)到對(duì)應(yīng)的PLC。下發(fā)也采用請(qǐng)求方式,請(qǐng)求包中包含對(duì)應(yīng)的內(nèi)存地址和待寫入的數(shù)值。周期發(fā)送請(qǐng)求命令以接收PLC數(shù)據(jù),采用事件的方式處理下發(fā)的數(shù)據(jù),任務(wù)調(diào)度模式如圖3所示。
圖3 任務(wù)調(diào)度模式
PLC數(shù)據(jù)驅(qū)動(dòng)系統(tǒng)在登錄成功后,進(jìn)行通信前需要與PLC建立安全通道。系統(tǒng)建立安全通道的流程如圖4所示,主要步驟如下:
(1)調(diào)用上位機(jī)密鑰服務(wù)進(jìn)程PCUkeySrv的接口,進(jìn)行初始化并建立與其的連接。
(2)從PCUkeySrv進(jìn)程獲取一個(gè)源隨機(jī)數(shù)。
(3)調(diào)用運(yùn)行在PLC嵌入式軟件中的下位機(jī)密鑰服務(wù)程序PLCUkeySrv的接口,進(jìn)行初始化,建立與其的連接,并發(fā)送源隨機(jī)數(shù)。
(4)從PLCUkeySrv進(jìn)程獲取對(duì)隨機(jī)數(shù)進(jìn)行加密后的返回?cái)?shù)據(jù)。
(5)將返回?cái)?shù)據(jù)發(fā)送給上位機(jī)PCUkeySrv進(jìn)程,通過(guò)調(diào)用設(shè)置會(huì)話密鑰及配置參數(shù)的接口,獲取返回參數(shù)。
(6)將返回參數(shù)發(fā)送給下位機(jī)PLCUkeySrv進(jìn)程,獲得原始數(shù)據(jù),并調(diào)用設(shè)置會(huì)話密鑰的操作,計(jì)算出與上位機(jī)密鑰進(jìn)程計(jì)算相一致的會(huì)話密鑰。系統(tǒng)通過(guò)比對(duì)返回?cái)?shù)據(jù)和源隨機(jī)數(shù),如一致,即可建立安全通道,進(jìn)行下一步。
(7)調(diào)用上位機(jī)密鑰服務(wù)進(jìn)程PCUkeySrv的接口,對(duì)發(fā)送數(shù)據(jù)進(jìn)行加密。
圖4 建立安全通道流程
(8)將加密后的發(fā)送數(shù)據(jù)發(fā)送給PLC,PLC調(diào)用下位機(jī)服務(wù)進(jìn)程PLCUkeySrv對(duì)數(shù)據(jù)進(jìn)行解密。
(9)PLC將加密后的上傳數(shù)據(jù)發(fā)送給系統(tǒng),系統(tǒng)調(diào)用上位機(jī)服務(wù)進(jìn)程PCUkeySrv對(duì)數(shù)據(jù)進(jìn)行解密。
PLC數(shù)據(jù)驅(qū)動(dòng)系統(tǒng)如果在任一步調(diào)用上位機(jī)密鑰服務(wù)接口時(shí)出現(xiàn)錯(cuò)誤,則斷開連接。PLC如果在任一步調(diào)用下位機(jī)密鑰服務(wù)接口時(shí)出現(xiàn)錯(cuò)誤,則發(fā)送錯(cuò)誤碼。為保證通信的實(shí)時(shí)性,通信建立時(shí),數(shù)據(jù)傳輸采用基于一次性密鑰(OTP)理念的流密碼的密碼機(jī)制,即每次通信而建立安全通道所產(chǎn)生的會(huì)話密鑰都是隨機(jī)產(chǎn)生的。
會(huì)話秘鑰即雙方通信的密碼,由上位機(jī)的唯一識(shí)別號(hào)和下位機(jī)的唯一識(shí)別號(hào)根據(jù)固定的算法生成,即達(dá)到了每一條鏈路具有自己的通信密碼。PLC收到請(qǐng)求后,先檢查對(duì)方的IP是否在白名單中,然后讀取自身的加密芯片的設(shè)備號(hào),再結(jié)合發(fā)送請(qǐng)求的設(shè)備號(hào)和密碼進(jìn)行核對(duì)。若匹配則發(fā)送下裝應(yīng)答,不匹配則返回拒絕應(yīng)答。軟件需一次連接多個(gè)PLC,所以在軟件組態(tài)中配置的所有PLC都在白名單里設(shè)置匹配關(guān)系,否則在線連接時(shí)會(huì)遇到不匹配的問(wèn)題。在上位機(jī)密碼設(shè)備與操作系統(tǒng)的適配工作完成后,將以上位機(jī)設(shè)備的私鑰作為各自唯一識(shí)別碼,并且在建立連接時(shí)先通過(guò)加隨機(jī)碼的“挑戰(zhàn)-響應(yīng)”機(jī)制進(jìn)行相互身份的鑒別。
與PLC通信正常啟動(dòng)后,系統(tǒng)主要工作過(guò)程有:讀取組態(tài)模塊生成的配置文件,獲取需要通信的PLC個(gè)數(shù)、IP地址及采樣周期;每個(gè)PLC采用一個(gè)獨(dú)立線程,登錄成功后,周期發(fā)送數(shù)據(jù)請(qǐng)求包,按同步通信方式處理,一問(wèn)一答;事件響應(yīng)軟件的下發(fā)數(shù)據(jù)請(qǐng)求,如果有輸出請(qǐng)求包,則插入內(nèi)存中數(shù)據(jù)處理隊(duì)列優(yōu)先處理,下發(fā)前進(jìn)行數(shù)據(jù)加密;診斷PLC的狀態(tài),并設(shè)置狀態(tài)點(diǎn);數(shù)字量輸出量清零保護(hù);系統(tǒng)將各種錯(cuò)誤或故障信息寫入軟件日志文件中。
從PLC請(qǐng)求讀出的數(shù)據(jù),在進(jìn)行數(shù)據(jù)解密后,與緩沖區(qū)存儲(chǔ)的上一個(gè)周期的舊數(shù)據(jù)進(jìn)行比較,若有變化,則調(diào)用無(wú)狀態(tài)數(shù)據(jù)包接口函數(shù)發(fā)送給軟件數(shù)據(jù)處理子進(jìn)程進(jìn)行后續(xù)處理。本機(jī)存儲(chǔ)的舊數(shù)據(jù)存放在模擬量輸入(AI)、數(shù)字量輸入(DI)、模擬量輸出(AO)、數(shù)字量輸出(DO)四個(gè)Map表的數(shù)據(jù)結(jié)構(gòu)中,如圖5所示。
圖5 本地?cái)?shù)據(jù)存儲(chǔ)結(jié)構(gòu)
AI/DI點(diǎn)變化的判斷原則:AI點(diǎn)數(shù)據(jù)與前值比較,值占2 B,DI點(diǎn)與前值比較,值占用1 B。本驅(qū)動(dòng)系統(tǒng)啟動(dòng)時(shí)的主站,或者由從站切換為主站后,發(fā)送全部點(diǎn)位的數(shù)據(jù)包,若與一個(gè)PLC連接中斷,新建立連接以后,也發(fā)送數(shù)據(jù)包,否則僅發(fā)送變更數(shù)據(jù)集。
對(duì)于有變化的模擬量點(diǎn),需先進(jìn)行高低字節(jié)交換,再進(jìn)行量程轉(zhuǎn)換,轉(zhuǎn)換成浮點(diǎn)數(shù)后,調(diào)用打包函數(shù)發(fā)送給軟件數(shù)據(jù)處理系統(tǒng)進(jìn)程。
在進(jìn)行量程轉(zhuǎn)換時(shí),對(duì)量程極大或極小時(shí)進(jìn)行溢出處理。對(duì)于有變化的數(shù)字量點(diǎn),無(wú)需轉(zhuǎn)換,直接調(diào)用打包函數(shù)發(fā)送給軟件數(shù)據(jù)存儲(chǔ)進(jìn)程。如診斷某個(gè)PLC故障,則此PLC的所有模擬量輸入和數(shù)字量輸入點(diǎn)設(shè)為壞點(diǎn)。從PLC周期請(qǐng)求的數(shù)據(jù),系統(tǒng)為每個(gè)PLC分配AI、DI數(shù)據(jù)共享內(nèi)存,并按組態(tài)的輸入ID號(hào)順序排列。
通信主模塊與PLC的通信采用問(wèn)答形式同步通信,如圖6所示。
圖6 PLC通信方式
通信數(shù)據(jù)包格式如表1所示,幀頭占24 B、CRC占4 B,數(shù)據(jù)區(qū)的長(zhǎng)度可變。為提高性能,系統(tǒng)僅對(duì)數(shù)據(jù)區(qū)的數(shù)據(jù)進(jìn)行加密,幀頭部分不進(jìn)行加密。
表1 請(qǐng)求/應(yīng)答幀消息格式
下發(fā)到PLC的模擬量和數(shù)字量數(shù)據(jù),系統(tǒng)調(diào)用軟件中變量定義模塊的模擬量或數(shù)字量輸出函數(shù)傳送到歷史主站上,由歷史主站上的軟件站間通信程序?qū)?shù)據(jù)解包按協(xié)議封包后,由系統(tǒng)進(jìn)行數(shù)據(jù)加密,送到對(duì)應(yīng)PLC。
輸出的模擬量需要先進(jìn)行量程轉(zhuǎn)換,即將浮點(diǎn)轉(zhuǎn)換為2 B的short,再進(jìn)行高低字節(jié)交換,然后將值進(jìn)行加密后發(fā)送至PLC。PLC對(duì)下發(fā)的數(shù)據(jù)進(jìn)行解密后實(shí)現(xiàn)控制邏輯。
通信的主從模式與上位機(jī)歷史站的主從狀態(tài)保持一致,系統(tǒng)向軟件任務(wù)管理系統(tǒng)周期發(fā)送心跳。通信的主從模式的切換時(shí)間由軟件中狀態(tài)診斷子系統(tǒng)決定,通信模塊每秒讀取任務(wù)主從狀態(tài),根據(jù)變化決定處理方式按主站模式還是從站模式。
通信主模塊判斷所有PLC的正常通信狀態(tài),如有變化則發(fā)送系統(tǒng)狀態(tài)包給軟件數(shù)據(jù)處理子系統(tǒng)進(jìn)程。根據(jù)PLC對(duì)數(shù)據(jù)站周期請(qǐng)求數(shù)據(jù)的應(yīng)答判斷PLC的狀態(tài),診斷PLC故障的時(shí)間通過(guò)讀取配置文件而獲得,通信主模塊在收到通信應(yīng)答后將狀態(tài)包數(shù)據(jù)中的故障值修改為正常值。
系統(tǒng)與PLC連接時(shí),支持在線變更端口、IP、采樣周期。當(dāng)組態(tài)發(fā)生變化時(shí),在存盤后向通信主模塊發(fā)送消息,告知發(fā)生變化的情況,并將對(duì)應(yīng)的PLC線程自動(dòng)關(guān)閉重啟。
為防止控制系統(tǒng)對(duì)設(shè)備運(yùn)行的控制產(chǎn)生誤操作,實(shí)現(xiàn)PLC控制的安全性,對(duì)控制現(xiàn)場(chǎng)設(shè)備的遙控量,即對(duì)數(shù)字量輸出點(diǎn)進(jìn)行保護(hù)。
系統(tǒng)記錄下發(fā)的所有數(shù)字量點(diǎn),下發(fā)的數(shù)字量點(diǎn)會(huì)定時(shí)清零,默認(rèn)的清零時(shí)間可通過(guò)配置文件設(shè)定,系統(tǒng)通過(guò)讀配置文件獲取。按配置的時(shí)間將數(shù)字量量值置0發(fā)送給PLC,并記錄在日志文件中。
系統(tǒng)每秒遍歷檢測(cè)所有的數(shù)字量輸出點(diǎn),如果數(shù)值為1則清零,計(jì)數(shù)器加1,如果累計(jì)到了10則將0值重新打包,加密后發(fā)送給PLC,實(shí)現(xiàn)自動(dòng)清零功能。如果在10 s內(nèi)收到從軟件發(fā)送1或0數(shù)據(jù)的請(qǐng)求,或者PLC主從切換時(shí),則該數(shù)字量輸出點(diǎn)的計(jì)數(shù)重新開始,即從零開始累計(jì),到10 s后自動(dòng)清零。
本文主要介紹了基于國(guó)產(chǎn)可信PLC、支持跨平臺(tái)的上位機(jī)監(jiān)控軟件中與PLC通信的數(shù)據(jù)驅(qū)動(dòng)系統(tǒng)的實(shí)現(xiàn)方法。對(duì)系統(tǒng)在Windows和國(guó)產(chǎn)Linux平臺(tái)上進(jìn)行了長(zhǎng)時(shí)段的運(yùn)行驗(yàn)證,結(jié)果表明,單PLC 1 s大約能處理8萬(wàn)個(gè)模擬量,1 s內(nèi)可處理20個(gè)響應(yīng)包,響應(yīng)時(shí)間滿足要求,且最多可支持64個(gè)PLC之間的并發(fā)處理。整個(gè)通信過(guò)程表現(xiàn)出較強(qiáng)的安全性、實(shí)時(shí)性和可靠性,滿足設(shè)計(jì)要求。