基于低代碼控制系統(tǒng)共享內(nèi)存使用,C#共享內(nèi)存實現(xiàn)
共享內(nèi)存
創(chuàng)建共享內(nèi)存及設(shè)定訪問權(quán)限,創(chuàng)建方法可能不同。
共享內(nèi)存地址是否正確,進(jìn)程通訊問題:命名管道、共享內(nèi)存、信號量等不同方式進(jìn)行通信,需要選擇相同的IPC機制。
共享內(nèi)存是一種進(jìn)程間通信(Inter-Process Communication, IPC)的方式,使得多個進(jìn)程可以訪問同一塊內(nèi)存區(qū)域。共享內(nèi)存的實現(xiàn)方法主要有以下幾種:
1、基于文件映射的共享內(nèi)存:這種方法將一個文件映射到共享內(nèi)存。當(dāng)進(jìn)程需要訪問共享內(nèi)存時,它會像訪問文件一樣訪問該內(nèi)存區(qū)域。這種方法的優(yōu)點是實現(xiàn)簡單,并且可以跨平臺使用。常見的系統(tǒng)調(diào)用包括 mmap()(在UNIX和類UNIX系統(tǒng)中)和 CreateFileMapping()(在Windows中)。
2、基于共享庫的共享內(nèi)存:這種方法通過將共享內(nèi)存作為共享庫來訪問。當(dāng)進(jìn)程需要訪問共享內(nèi)存時,它會像調(diào)用庫函數(shù)一樣調(diào)用該內(nèi)存區(qū)域。這種方法的優(yōu)點是可以利用操作系統(tǒng)的共享庫功能,缺點是需要在運行時動態(tài)加載庫。
3、基于管道的共享內(nèi)存:這種方法使用管道(pipe)作為共享內(nèi)存。進(jìn)程可以通過讀寫管道來交換數(shù)據(jù)。這種方法的優(yōu)點是實現(xiàn)簡單,但是只能用于兩個進(jìn)程之間的通信。
4、基于消息隊列的共享內(nèi)存:這種方法使用消息隊列作為共享內(nèi)存。進(jìn)程可以通過發(fā)送和接收消息來交換數(shù)據(jù)。這種方法的優(yōu)點是實現(xiàn)簡單,但是只能用于兩個進(jìn)程之間的通信。
5、基于套接字的共享內(nèi)存:這種方法使用套接字作為共享內(nèi)存。進(jìn)程可以通過讀寫套接字來交換數(shù)據(jù)。這種方法的優(yōu)點是實現(xiàn)簡單,但是只能用于兩個進(jìn)程之間的通信。
以上就是共享內(nèi)存的幾種實現(xiàn)方法,每種方法都有其優(yōu)缺點,適用于不同的場景。
基于文件映射的共享內(nèi)存可以實現(xiàn)兩個進(jìn)程或多個進(jìn)程之間的數(shù)據(jù)共享交互,且與開發(fā)語言無關(guān),跨平臺應(yīng)用程序數(shù)據(jù)交互。本次使用低代碼控制系統(tǒng)原本擁有的功能采用該方法C#控制臺程序來簡要介紹一下使用方法。
低代碼控制系統(tǒng)中
低代碼系統(tǒng)創(chuàng)建共享內(nèi)存,共享內(nèi)存命名有效時,將所有變量放入共享內(nèi)存中。多工站系統(tǒng)服務(wù)器與各工站之間都可以創(chuàng)建共享內(nèi)存命名提供交互,實現(xiàn)對全部低代碼普通變量交互,注意命名不要沖突。共享內(nèi)存命名在Ctrl_Teach.txt文件中自定命名,有命名時將所有變量放入共享內(nèi)存;依據(jù)需求是否讀取創(chuàng)建的共享內(nèi)存。

C#實現(xiàn)共享內(nèi)存讀寫交互例程案例:
共享內(nèi)存可以指示內(nèi)存起始地址偏移量及個數(shù),注意低代碼每個變量為8字節(jié)浮點數(shù),讀寫共享內(nèi)存操作,0為起始地址。

低代碼系統(tǒng)中共享變量(全局變量)創(chuàng)建共享內(nèi)存讀寫實現(xiàn),共享內(nèi)存命名在Ctrl_Mtn.txt文件中,配置有效命名后即可同樣實現(xiàn)將所有共享變量放入共享內(nèi)存中。


內(nèi)存映射文件,C#基于文件映射的共享內(nèi)存實現(xiàn)方法。
共享內(nèi)存創(chuàng)建方實現(xiàn):C#創(chuàng)建共享內(nèi)存,持續(xù)寫入,實現(xiàn)數(shù)據(jù)共享。
//創(chuàng)建共享內(nèi)存
MemoryMappedFile shareMemory = MemoryMappedFile.CreateOrOpen("Station_1", size);
//可隨機訪問的內(nèi)存塊。
MemoryMappedViewAccessor stream = shareMemory.CreateViewAccessor(0, size);
//內(nèi)存流。調(diào)用Write按順序依次寫入,不可超出容量。
var stream = shareMemory.CreateViewStream(0, size);
共享內(nèi)存讀取(打開)方實現(xiàn):可以自定義讀取數(shù)據(jù)與寫入數(shù)據(jù)。
//打開共享內(nèi)存
MemoryMappedFile shareMemory = MemoryMappedFile.OpenExisting("Station_1");
//可隨機訪問的內(nèi)存塊。
MemoryMappedViewAccessor accessor = shareMemory.CreateViewAccessor(0, 8 * 10000);
//內(nèi)存流。調(diào)用Read按順序依次讀取。
var accessor = shareMemory.CreateViewStream(0, 8 * 10000);
通過以上描述,我們就可以在同一設(shè)備中采用C#開發(fā)的進(jìn)程應(yīng)用等通過共享內(nèi)存的方法實現(xiàn)對低代碼控制系統(tǒng)的讀寫交互,可以實現(xiàn)二次開發(fā)。共享內(nèi)存由操作系統(tǒng)分配實現(xiàn),非常便捷。應(yīng)用于視覺開發(fā),界面設(shè)計,上位機開發(fā)等場景。
