CoDeSys是全球最著名的PLC內核軟件研發廠家德國的3S(SMART,SOFTWARE,SOLUTIONS)公司出的一款與制造商無關的IEC 61131-1編程軟件。CoDeSys 支持完整版本的IEC61131標准的編程環境,支持標准的六種編程語言。是一個標准的軟件平台,被很多硬件廠家支持,可編程超過150家OEM生產的自動裝置。CoDeSys提供了許多組合產品的擴充,諸如各種不同領域的總線配置程序、完全的目測化和運動控制系統。
CoDeSys是一種功能強大的PLC軟件編程工具,它支持IEC61131-3標准IL 、ST、 FBD 、LD、 CFC、 SFC六種PLC編程語言,用戶可以在同一項目中選擇不同的語言編輯子程序,功能模塊等。
CoDeSys是可編程邏輯控制PLC的完整開發環境(Controlled Developement System的縮寫),在PLC程序員編程時,CoDeSys為強大的IEC語言提供了一個簡單的方法,系統的編輯器和調試器的功能是建立在高級編程語言的基礎上(如Visual C )。
現在國內PLC用戶使用的版本多為CoDeSys V2.3,最新的版本是CoDeSys V3(目前最新版本為V3.5)。V3 在軟件架構上有了很大的改善,朝安全軟件的方向發展,目前正在申請TUV關於EN 61508的SIL認證。
HOLLSYS(和利時G3 PLC),Kinco(深圳步科F1 PLC),ABB AC500系列,IFM,EPEC,Rexroth,Wago,Parker,Beckhoff,Festo,施耐德等PLC廠家都是使用CoDeSys平台開發自己的編程軟件的。當然了,還有很多其他公司。
另外,CoDeSys也提供觸摸屏功能(Visualization),但這不是他的強項,基本都是采用OPC 工控機的方案,ABB,倍福都有很好的方案,都是面向不差錢的客戶。
3S競爭者
CoDeSys的其他競爭對手還有KW、infoteam、ISAGRAF。聽說infoteam(國內稱一方梯隊)也挺牛的,不太了解,想說說KW,同屬於德國企業,主要是產品為multiprog。
KW的主要客戶有菲尼克斯的AutomationWorx、富士電機的D300Win、研華的Multiprog,苞米勒的PLC和伺服系列,三菱應該也是它的大客戶,但是編程方式卻是按照日本人的習慣來的。
CoDeSys框架組成
兩部分:
1、CoDeSys IDE。
即CoDeSys集成開發環境,符合IEC61131編程規范,安裝於PC機上,運行於Windows或者Linux下。由最終應用用戶所使用的開發工具。
2、CoDeSys Runtime。
即硬件平台系統。需要設備制造商與3S公司共同完成,3S公司需要評估硬件開發商所設計的硬件系統,並為其定制CoDeSys Runtime框架,客戶需要為此向3S付費。然后硬件及系統開發商需要根據本系統的外圍輸入輸入等配置,編寫相應的驅動,並以庫或者PLC Configure接口的形式提供給CoDeSys ID開發環境調用。實際上就是形成一套Target安裝包。此外,CodeSys還會對每個使用其CoDeSys Runtime的設備貼標,設備供應商需要為每個3S標牌付費,作為其知識產權的一部分。
3、最終用戶(應用開發商)可以下載通用的CoDeSys IDE。
里面提供基本的IEC61131編程環境,但是對於一個具體的硬件PLC或者HMI,需要安裝與該硬件相對應的Targets包。這個 Targets包的入口文件是*.tnf文件,有其來指定:
1、targets(*.tar)文件,對應 CoDeSys IDE的Target Setting項.
2、PlcConf文件夾下的*.cfg文件,對應CoDeSys IDE的PLC Configuration項。其安裝路徑由InstallTarget組件程序的Installation選項指定。反映在CoDeSys IDE上就是:Project\Options\Directories\Target\Configuration files: "**\*\PlcConf\"。
3、Lib文件夾下的諸*.lib文件,提供底層的CoDeSys Runtime的驅動接口。對應CoDeSys IDE的Library Manager。其安裝路徑由InstallTarget組件程序的Installation選項指定。反映在CoDeSys IDE上就是:Project\Options\Directories\Target\Libraries: "**\*\Libs\"。
上圖,就是安裝target的過程,也就是每個OEM廠家安裝自己硬件的過程。
CoDeSys底層運行原理
Codesys runtime是建立在OS上的,常見的OS有wince,windows,linux,vxworks。構建在OS的優勢就在於系統的擴展性更強,PC的更多功能都可以在PLC上實現。
control task被操作系統每隔一段時間(典型是1ms)調用一次。
IEC task被內建的看門狗監控,監視PLC的實際工作周期是否超出預定時間,如果超出則IEC task任務停止,向系統報告錯誤。
說到這里講講PLCOPEN的IEC 61131-3標准(這個IEC具體名字,網上現查的,方博士掌握的很好)。IEC 61131-3多任務操作系統,也沒查到具體如何實現,自己之前做過嵌入式開發,了解OS以及RTOS,自認為和RTOS類似,熱情高的朋友可以網上看看RTOS,重點是RTOS的優點是什么?歐洲的產品都很注重概念,概念理解了,就可以讓你自由發揮。這里就多插一句,日系PLC在做大型項目時,還是和低端PLC一樣,編程習慣類似匯編,編程上想要實現框架的概念非常難,因此在歐洲比較難推廣。現在日系也在改進,加入了ST編程,使用了功能塊,也算是日本人的妥協吧。
這里有幾個概念:
優先級,數值越小優先級越高,根據任務的實時性,設定優先級
任務類型
循環:周期性執行任務
自由運行:只要啟動程序就處理任務,CPU空閑就運行該task。
Event觸發型:觸發位的上升沿調用程序。外部事件觸發功能,未定制的廠家此選項不能使用
看門狗(早期單片機上的一個概念,紡織程序進入死循環,提出了定時喂狗的概念,其本質就是一個減法定時器)
說說MCU如何使用watchdog吧。
while(1)
{
//用戶自己寫的程序
Watchdog = 10ms; //watchdog timer后台按照tick做減法,如果timer為0,就觸發一個硬件中斷,告訴用戶程序在單位時間內沒執行完,檢查錯誤。正常則每次喂狗,設置timer為10ms
}
CoDeSys的watchdog定時監視PLC的實際工作周期是否超出預定時間,避免PLC在執行程序的過程中進入死循環,或者PLC執行非預定程序造成系統癱瘓。當任務超時,任務復位,進入初始狀態,繼續執行。
對比一下AB control logix的任務實現
control logix項目分為任務(task),程序(program)和例程(routine)。
任務(task):每個control logix控制器最多32個任務,僅有一個continuous任務,其余為Periodic或者event任務。
任務命名包括任務功能,優先級和執行周期
任務的三種類型:
1. 連續型任務,指的是周而復始連續執行的任務,一個項目只允許定義1個,亦可以不定義,等同於codesys中的PLC_PRG(POU)。
2. 周期型任務,定時中斷執行的邏輯程序,需定義周期時間,設定優先級別,最多可以定義31個
3. 事件觸發型任務,事件觸發引起的任務調度,事件觸發可以是外部輸入點引起(如同PLC5/SLC),也可以由consumed tag引起或者直接指令調用引起,還可以由運動控制狀態引起,需要設定優先級別,最多定義31個。
Control logix中的producer/consumer的概念非常好,體現在其組網能力上。比如某一個模塊是消息的生產者,產生消息存放在消息塊中,其他需要此變量的功能塊,定義一個消息consumer即可。有興趣的朋友可以自己看看相關資料。
CoDeSys的編程工具
IL 、ST、 FBD 、LD、 CFC、 SFC六種語言,我個人比較鍾愛ST,CFC。
CodesysV2.3還是強調過程編程,到了V3.5則強調面向對象,C 的影子更多了。
言歸正傳,應用者也不需要關心那么多技巧,能實現功能,並且代碼具有可維護性就是一個合格的工程師。
1.高級語言中的struct,union。
Stuct在西門子SCL語言中被稱為UDT(user defined type),AB RSLogix 5000中也被稱為UDT
TYPE TRAFFIC :
(RED, YELLOW:=1, GREEN:=10);
END_TYPE
TYPE STRUCT1 :
STRUCT
P1:INT;
P2:INT;
P3:INT;
END_STRUCT
END_TYPE
2.指針,c,c 中的頂級利器,在codesys中也可以使用
Example in ST:
pt:POINTER TO INT;
var_int1:INT;
var_int2:INT;
pt := ADR(var_int1);
var_int2:=pt^;
3.FC,FB的概念
上述是CoDeSys說明書的例程,不知道看出有什么不同?
FC在程序中直接調用即可,FB則需要先定義實例(instance),Instance: FUB。這里的Instance就是C 中的對象實例。怎么理解這個實例呢?上個最傻的高級語言的例子吧。
class Student
{
int age;
int sex;
int grade;
void DoWork(void);
};
Student tony, jany;
tony.age = 10;
tony.sex = male;
tony.grade = 3;
tony.DoWork();
jany.age = 9;
jany.sex = female;
jany.grade = 3;
jany.DoWork();
這里的DoWork就類似FB,可以看到FB帶有自己獨立的數據塊,比如例中的age,sex,grade。
對比西門子S300/S400的FC、FB
1.FC不具備自己的存儲區,FB有自己的存儲區-背景DB。
2.FC和FB都有自己的TEMP變量,存儲在系統的本地stack上。當FC和FB調用完畢,TEMP變量會釋放。
3.FB有靜態變量,FC沒有。靜態變量在背景DB中,FB調用完畢,靜態變量仍然有效。
西門子300中,DB分為背景DB和共享DB,背景DB和FB相關聯。
景DB和共享DB沒有本質區別,它們的數據都可以被任何一個DB,FC或者FB讀寫。它們的區別在於使用目的:背景DB為FB提供數據,其數據格式和FB變量聲明一致;共享DB目的為用戶程序提供一個可保存的數據區。
如果對C比較熟悉,可以這樣理解:FC和FB像C中的函數,只不過FB可以生成靜態變量,在下次函數調用時數據可以保留,而FC的變量只在調用期內有效,下次調用又重新更換。每次調用FC的I/O區域必須要自己每次手動輸入,而FB就不要,省去不少麻煩,如果在上位機控制直接輸入DB控制地址就可!
看到這里,大家再思索一下,德系PLC的編程思想雖然實現形式不同,但強調的概念都一樣,一定要理解這些概念,才能熟練應用。
4.PLC_PRG
PLC_PRG是一個預定義的POU(program of unit),每個工程必須包含這個特定的程序,這個POU在每個cycle中調用一次。其本質就是一個freewheeling程序。
如果使用了多任務,可以不包含PLC_PRG,按照任務配置表執行特定程序。
5.lib庫的使用
Lib的使用體現了codesys高級語言的特性,支持math.lib,string.lib,canopen.lib,可以使用自定義的lib
用戶自己實現的lib庫,包含兩種:Internal lib,External lib,有什么區別呢?
內部是完全利用CoDeSys實現的自定義lib庫。外部庫則需要利用相關的編譯鏈去編譯,更多被底層開發者所采用,可以直接利用OS底層的API進行編程,性能效率更高。
6.好用的case語句
CASE INT1 OF
1, 5:
BOOL1 := TRUE;
BOOL3 := FALSE;
2:
BOOL2 := FALSE;
BOOL3 := TRUE;
10..20:
BOOL1 := TRUE;
BOOL3:= TRUE;
ELSE
BOOL1 := NOT BOOL1;
BOOL2 := BOOL1 OR BOOL2;
END_CASE;
case語句是我比較喜歡的功能,可以實現手動自動,可以實現多工位。
K5 PLC沒有日系的STL,也沒有西門子的SCR指令,可以通過其他方式實現類case方法,大家也可以思考下。
更多CoDeSys的使用細節可參考CoDeSys說明書“CoDeSys_V23_E.pdf”
能想到的也就這些,暫時寫到這里吧,文中更多強調的是概念,具體編程實現和技巧涉及很少,個人實戰也不是很多,認識也有膚淺,大家看后有什么好的想法,也請告知,謝謝!