天天看點

【工業序列槽和網絡軟體通訊平台(SuperIO)教程】四.開發裝置驅動

SuperIO相關資料下載下傳: http://pan.baidu.com/s/1pJ7lZWf

1.1    開發準備

把“開發包”内的所有檔案複制到項目的“bin”目錄下,或項目下的專用生成目錄。開發封包件包括如下圖:

【工業序列槽和網絡軟體通訊平台(SuperIO)教程】四.開發裝置驅動

  SuperIO.dll是軟體平台的核心子產品, SuperIO目錄是軟體平台的參數配制、資料存儲的目錄。

1.2    項目配制

1)目标架構選擇Framework4.0

【工業序列槽和網絡軟體通訊平台(SuperIO)教程】四.開發裝置驅動

2)生成的目标平台采用x86

【工業序列槽和網絡軟體通訊平台(SuperIO)教程】四.開發裝置驅動

所有事例程式的目标平台采用x86。主要考慮到32位作業系統與64作業系統的相容性。

1.3    假定通訊協定

1.3.1    發送讀實時資料指令協定

計算機發送0x61指令為讀實時資料指令,共發送6個位元組,校驗和為從“從機位址”開始的累加和,不包括“資料報頭”、“校驗和”和“協定結束”。

發送指令資料幀如下:

【工業序列槽和網絡軟體通訊平台(SuperIO)教程】四.開發裝置驅動

1.3.2    解析實時資料協定

    下位機接收到讀實時資料指令後,并校驗成功,傳回實時資料,校驗和為從“從機位址”開始的累加和,不包括“資料報頭”、“校驗和”和“協定結束”。

接收資料幀如下:

【工業序列槽和網絡軟體通訊平台(SuperIO)教程】四.開發裝置驅動

1.3.3    發送和接收資料事例

發送(十六進制):0x55 0xaa 0x00 0x61 0x61 0x0d

接收(十六進制):0x55 0xaa 0x00 0x61 0x43 0x7a 0x00 0x00 0x43 0xb4 0x15 0x0d

流量資料為:250.00

信号資料為:360.00

1.4    建立裝置子產品

如下圖:

【工業序列槽和網絡軟體通訊平台(SuperIO)教程】四.開發裝置驅動

增加對SuperIO.dll的引用,如下圖:

【工業序列槽和網絡軟體通訊平台(SuperIO)教程】四.開發裝置驅動

    項目的配制請參見:1.2項目配制。

1.5    建構協定驅動

    建立兩個類:MySendProtocol 和MyReceiveProtocol,MySendProtocol繼承SCL.Device.DeviceSendProtocol基類,MyReceiveProtocol類繼承SCL.Device.DeviceReceiveProtocol。

      MySendProtocol 和MyReceiveProtocol兩個類都重寫(override)“Function61”函數,MySendProtocol類中的Function61函數完成打包發送指令操作,MyReceiveProtocol類中的Function61函數完成解析資料操作,FunctionXX在兩個類中都會成對出現,主要是為了好記。

     在MySendProtocol執行個體中可以調用DriverFunction函數,傳入相應的指令,例如:0x61。會自動調用“Function61”函數,作為調用相應指令函數的驅動接口。GetSendCmdBytes函數接口是在DriverFunction函數基礎上封裝的,同樣也可以使用,但是要把“isbox“設定成false,否則會對發送的資料做特殊的處理。

   在MyReceiveProtocol執行個體中可以調用DriverFunction函數,傳入相應的指令,例如:0x61。會自動調用“Function61”函數,作為調用相應指令函數的驅動接口。GetAnalysisData函數是在DriverFunction函數基礎上封裝的,同樣可以使用,隻是多調用了一層GetCommand函數接口。

    具體代碼請參見:DeviceDemo項目。

1.6    建構參數和實時資料執行個體類

建立兩個類:MyDeviceParameter和MyDeviceRTDataMyDeviceParameter繼承SCL.Device.DeviceParameter類,用于儲存備參數,可以在此類中增加新的裝置參數。

           MyDeviceRTData繼承SCL.Device.DeviceRealTimeData類,用于儲存裝置的實時資料,可以根據通訊協定自定義裝置的實時資料。

      這兩個類繼承基類後會自動繼承SaveSerialize和GetSerialize兩個泛型函數,SaveSerialize函數是把目前對象序列化成XML,GetSerialize是把序列化的XML反向生成對象執行個體。

          SCL.Device.DeviceParameter類和SCL.Device.DeviceRealTimeData類是繼承自SerializeOperation類,他們的接口是IserializeOperation,SerializeOperation隻是一個簡單的序列化XML操作類庫。

     如果開發者想完全自定義一個資料持久檔案,那麼可以繼承IserializeOperation接口,重寫相應的接口函數,自定義存儲資料的方式。

1.7    建構裝置驅動

      “建構協定驅動”和“建構參數和實時資料執行個體類”兩節都是為建構運作裝置做的前期準備,将作為運作裝置的屬性。

      建立一個裝置類:MyDevice,它繼承自SCL.Device.RunSCLDevice1。

開發者注意到還有一個SCL.Device.RunSCLDevice類,它是比較早的運作裝置類,考慮的平台的相容性,現在還在繼承使用,但是新開發的裝置模型不建議使用SCL.Device.RunSCLDevice類。

它們都是繼承自IRunSCLDevice接口。

1.7.1    常用接口

1)         public override

SCL.ProtocolDriver.ISendProtocol SendProtocol

把寫好的發送協定類執行個體化之後,在此傳回。例如:MySendProtocol類。

2)         public override

SCL.ProtocolDriver.IReceiveProtocol ReceiveProtocol

把寫好的接收協定類執行個體化之後,在此傳回。例如:MyReceiveProtocol類。

3)         public override

SCL.Device.IDeviceParameter DeviceParameter

把寫好的裝置參數類執行個體化之後,在此傳回。例如:MyDeviceParameter類。

4)         public override

SCL.Device.IDeviceRealTimeData DeviceRealTimeData

把寫好的實時資料類執行個體化之後,在此傳回。例如:MyDeviceRTData類。

5)         public override void

InitDevice(int devid)

初始化裝置,可以在這裡對發送協定、接收協定、裝置參數和實時資料等資訊進行初始化。

6)         public override byte[]

GetRealTimeCommand()

這個類是傳回讀實時資料指令,當CommandCache指令緩沖區中有可發送指令的時候,優先讀、發送取指令緩沖區中的指令資料;如果CommandCache指令緩沖區沒有資料的時候,軟體平台會自動調用GetRealTimeCommand函數接口,傳回讀實時資料指令,進行發送。

7)         public override void

DealData(byte[] data)

當通訊正常時,軟體平台會把接收到的資料自動傳入到這個函數,可以調用ReceiveProtocol屬性進行解析資料以及處理、分析、儲存。通訊正常與否和接收協定類中CheckData函數接口有關。

8)         public override void

UnRegDevice()

當軟體平台沒有注冊的時候,軟體平台會調用這個函數。

9)         public override void UnknownIO()

當通訊鍊路為null的時候,軟體平台會調用這個函數。例如:序列槽未打開、網絡沒有連接配接等。

10)     public override void

CommunicateChanged(SCL.Device.IOState ioState)

當通訊狀态發送改變的時候,軟體平台會調用這個函數。通訊狀态包括:通訊正常、通訊中斷和通訊幹擾。

11)     public override void

CommunicateError()

當通訊幹擾的時候,軟體平台會調用這個函數。通訊正常與否和接收協定類中CheckData函數接口有關。

12)     public override void

CommunicateInterrupt()

當通訊中斷的時候,軟體平台會調用這個函數。通訊正常與否和接收協定類中CheckData函數接口有關。

13)     public override void

CommunicateNone()

當未知通訊狀态的時候,軟體平台會調用這個函數。一般情況下不會出現此類情況。

14)     public override void SaveData()

對處理的資料進行儲存。

15)     public override void Alert()

判斷資料是否異常,如果出現異常資料,在進行報警處理。

16)     public override void ShowData()

顯示資料處理,用于更新裝置運作器,以及自定義UI和導出資料。

17)     public override void

DeviceTimer()

每個裝置會配置設定一個定時器,預設1秒鐘調用一次這個函數。可以通訊IsStartTimer屬性啟動、停止定時器,通過TimerInterval屬性設定定時器執行間隔。

18)     public override

SCL.Device.DeviceType DeviceType

傳回裝置類型,裝置類型包括:普通裝置、虛拟裝置以及其他。

19)     public override

s y s t e m.Windows.Forms.Control DeviceGraphics

傳回裝置圖形化界面。

20)     public override void

ShowContextMenu()

顯示上下文菜單函數。

21)     public override string

ModelNumber

傳回裝置子產品編号,也就是裝置的型号,這個編号盡量要求不能重複。

24)public void ShowMonitorIODialog();

顯示通道螢幕視窗

25)public void

ShowMonitorIOData(byte[] data, string desc);

向運作螢幕中顯示資料資訊

1.7.2    屬性說明

     下面是裝置具有的屬性,請參考。

1)         UserLevel

使用者級别屬性,包括:未知使用者、普通使用者、低級使用者和進階使用者等四個級别。

2)         IsStartTimer

獲得或設定是否開啟目前裝置的時鐘,預設不開啟。

3)         TimerInterval

獲得或設定目前裝置時鐘的間隔時間,預設為1秒。

4)         IsRegLicense

獲得或裝置目前裝置是否被注冊,預設不注冊。

5)         RunDevicePriority

獲得或設定目前裝置運作級别,分為:普通和優先。如果為優先級别,則先調用該進行發送和接收資料。

6)         CommunicationType

獲得或設定目前裝置的通訊類型。包括:序列槽和網絡兩種。

7)         CommandCache

獲得或設定目前裝置指令緩沖,如果有要發送的資料,則優先調用指令緩沖的資料進行發送。

8)         IsRunDevice

獲得或設定是否運作目前裝置,如果設定false,目前設定不參加運作(發送和接收資料)。

9)         DeviceParameter.IsSaveOriginBytes

辨別是否儲存原始發送和接收的位元組資料,如果儲存,預設儲存路徑在D盤。

10)      object Tag

臨時标記屬性。

11)      object SyncLock

同步鎖對象

1.7.3    事件說明

以下裝置事件都是在原有事件的基礎上進行封裝的函數,開發者可以直

接調用以下觸發事件的函數,軟體平台在啟動的時候已經預設加載了這些事件。

1)         void OnReceiveDataHandler(byte[]

revdata);

觸發接收資料事件

2)         void OnSendDataHandler(byte[]

senddata);

觸發發送資料事件,當網絡通訊的時候,應用Self模式的時候,可以通過這個事件自主發送資料。

3)         void OnDeviceRuningLogHandler(string

statetext);

把裝置運作日志輸出到運作螢幕

4)         void OnUpdateContainerHandler();

觸發更新運作螢幕事件

5)         void OnCOMParameterExchangeHandler(int

oldcom, int oldbaud, int newcom, int newbaud);

序列槽改變事件。

6)         void OnDeviceObjectChangeHandler(object

obj);

對象資料改變事件,用于驅動顯示、導出、服務等子產品。

7)         void OnDeleteDeviceHandler();

删除裝置事件

1.7.4    進階應用

1)         void RunIODevice

(SCL.CommunicateController.IDeviceIO io)

可以重寫這個函數,在這裡改變裝置運作的流程,根據CommunicationType屬性指定的通訊類型,可以把io參數轉換為網絡通訊接口ISocket或序列槽通訊接口ICOM,之後可以有針對性的對發送操作和接收操作進行二次開發。一般不建議重寫這個函數。

2)         void Send(SCL.CommunicateController.IDeviceIO

io, byte[] sendbytes)

可以重寫這個函數,根據CommunicationType屬性指定的通訊類型,可以把io參數轉換為網絡通訊接口ISocket或序列槽通訊接口ICOM,進行發送資料操作。在不重寫RunDevice函數的情況下,在合适的應用場景可以重寫這個函數。

3)         byte[] Receive(SCL.CommunicateController.IDeviceIO

io)

可以重寫這個函數,根據CommunicationType屬性指定的通訊類型,可以把io參數轉換為網絡通訊接口ISocket或序列槽通訊接口ICOM,進行接收資料操作。在不重寫RunDevice函數的情況下,在合适的應用場景可以重寫這個函數。

4)         void SaveBytes(byte[] data,

string desc)

可以重寫這個函數,對發送的資料和接收的資料進行自定義儲存。預設儲存在"d:軟體平台 原始資料"目錄下。

5)         void SocketConnect(string ip,

int port)

可以重寫這個函數,當網絡通訊的時候,有用戶端連接配接到軟體平台會調用這個函數接口。

6)         void SocketDisconnect(string

ip, int port)

可以重寫這個函數,當網絡通訊的時候,有用戶端與軟體平台斷開會調用這個函數接口。

1.8    裝置調試

1.8.1    界面方式排程

   界面方式測試主要是建構一個主程式,模拟真實的應用程式對裝置進行

測試。推薦使用這種測試方法。

1)  引用元件

主要引用DeviceDemo程式集。如下圖:

【工業序列槽和網絡軟體通訊平台(SuperIO)教程】四.開發裝置驅動

測試裝置

界面方式測試是有窗體界面的,必須繼承“SCL.UI .MainForm”類,并用代碼把軟體平台設定成調試模式“SuperIO.Device.DebugDevice.IsDebug = true;”,如圖:

【工業序列槽和網絡軟體通訊平台(SuperIO)教程】四.開發裝置驅動

在Form_Load中初始化執行個體,并且加載調試裝置子產品,主要是建立裝置執行個體、初始化參數、進行裝置調試,如:this.DebugDevice((IRunDevice)_myDevice)語句。如下圖:

【工業序列槽和網絡軟體通訊平台(SuperIO)教程】四.開發裝置驅動

3)IO監測器,顯示發送和接收的原始十六進制資料,便于調試。如下圖:

【工業序列槽和網絡軟體通訊平台(SuperIO)教程】四.開發裝置驅動

4)用VirtualSerialPortDriver在本機虛拟出來兩個序列槽,兩個序列槽實作了虛拟連接配接,例如:COM1和COM2;打開序列槽助手軟體和平台軟體(SuperIO平台),分别設定COM1和COM2,按照“1.3假定通訊協定”發送和接收資料。相關軟體在“輔助工具”目錄裡有。如下圖:

【工業序列槽和網絡軟體通訊平台(SuperIO)教程】四.開發裝置驅動

具體測試代碼,請參見:FormTest項目。

1.8.2    控制台方式調試

控制台測試,沒有UI顯示界面,部分功能可能測試不全。需要通過

SCL.Device.IdebugDevice

debug= SCL.Device.DebugDevice.GetDebugInstance()獲得調試執行個體。其他代碼與“界面方式測試”一樣。如下圖:

【工業序列槽和網絡軟體通訊平台(SuperIO)教程】四.開發裝置驅動

1.9    挂載裝置子產品

在“工業序列槽和網絡軟體通訊平台_SuperIO”目錄下找到【ConfigTool.exe】應用程式,選擇【裝置配置】選卡,單擊【挂載裝置】按鈕,把剛才開發的裝置驅動子產品挂載到平台下。如下圖:

【工業序列槽和網絡軟體通訊平台(SuperIO)教程】四.開發裝置驅動

1.10    在平台下運作裝置

     把裝置驅動挂載好之後,運作“工業序列槽和網絡軟體通訊平台_SuperIO”目錄下的【SuperIO_Run.exe】應用程式,選擇【使用者管理】->【使用者登陸】菜單,選擇【工程師】或【管理者】使用者,輸入預設的密碼:123。

登陸到軟體平台後,選擇【裝置管理】->【增加裝置】菜單,選擇剛才挂載的裝置驅動子產品。如下圖:

【工業序列槽和網絡軟體通訊平台(SuperIO)教程】四.開發裝置驅動

開發的好的裝置驅動子產品同時支援COM(串品)和TCP(網絡)兩種通訊方式,TCP(網絡)通訊時支援Client和Server兩種工作模式。

作者QQ:504547114

交流QQ群:54256083

官方網址: http://www.bmpj.net

源文章位址:http://www.bmpj.net/index.php?m=article&f=view&id=4