有朋友想定制一個凈水機控制器,有一些獨特的功能要增加,但是商品控制板沒有這樣的功能,問我能否做一個,我覺得單片機完全能滿足這種簡單的控制需要,上手開始編程序時候突然感到,用PLC邏輯編這種功能是非常簡單輕松的,而如果用匯編或C編卻感覺有點棘手,編程效率不高,所以想為何不在單片機上實現PLC的邏輯呢?
上網搜索嘗試看能否找到合適的程序下載來稍微改改就能用的呢?方案幾年前就有了,實際上是利用三菱的低檔PLC編程軟件編輯好梯形圖,存盤后用專用的格式轉換工具轉換成HEX單片機燒寫文件燒進去,嘗試下載三菱PLC工具軟件,但是在我的WIN7-64位系統上不能正常工作,好容易換了系統裝好開發工具,但是初次上手這款開發工具,界面挺復雜的,懶得研究各個按鈕的使用,由于是單片機的硬件,對于程序的編制和轉換有很多限制條件,否則是轉換不成功的,嫌麻煩,放棄!
某寶倒是有百元PLC板出售,但是為了這么個簡單的東西專門買個全功能板子有點浪費,而且其編程軟件仍然是三菱的盜版軟件,算了,再想辦法把。
由于工作中經常接觸PLC程序,對其工作原理也略知一二,網上也有相關的說明介紹,其實就是三個主要步驟,第一步掃描IO輸入,第二步執行邏輯,第三步輸出邏輯到IO,很簡單的,最早PLC也是用單片機實現的,我為何不用匯編在51上搭建一個架構,簡單的邏輯編制進去就能運轉呢?
其中邏輯執行步驟還是有點意思的,需要把PLC邏輯翻譯成單片機的匯編語言執行,這塊開始也沒有把握,后來搜索到一篇百度文章,介紹了一下三菱PLC邏輯是如何翻譯成匯編的,我看了下估計其實是利用反匯編工具把HEX反編譯成的ASM代碼,并不清晰明了,而且還帶著反匯編時候的行號,僅供參考了。
搜索結果中也有幾篇論文,涉及到在51單片機上實現PLC邏輯的內容,但是那些論文都是充數的,僅僅幾個IO邏輯,沒有什么定時器,計數器功能的體現,哎!僅供參考!
看來這個PLC系統還是需要自己寫了!OK!既然決定自己重寫,那就開工吧!利用春節休假時間,編制了如下ASM51匯編PLC代碼:
代碼主要架構如下:
1、IO定義部分:根據所使用的單片機IO口數量,任意指定多少個I多少個O,那幾個腳是I,哪幾個是O都可以任意指定,在這個51系統里面設計了最大32個I,32個O,占用64個位尋址區域,其實用不到那么多,也可以分配給其它需要的標志位用,因為51系統總可位尋址地址只有128位,需要仔細分配.
2、位尋址變量定義(包括各類標志位,臨時變量寄存器等等)目前設計了8個計時器的Timer DN, Timer EN,共16位,8個計數器的counter reset 和counter DN 標志位共16個,專用于上升沿下降沿檢測的標志位4對,占用8個,剩余用于臨時變量,這些地址分配在這塊變量定義區域可以根據需要任意調整
3、內存規劃,包括堆棧區的設置,定時器,計數器的累加值和預設值地址等等,目前初步定義8個計數器的當前計數值和預設值,8個計時器的當前計數值和預設值,共占用32個內存地址,也可根據需要調整,51單片機片內總的用戶可用內存地址包括堆棧區只有128個,實際去除位尋址區和堆棧區可用的估計只有80個左右,不過對于小程序應該夠用的。沒必要去增加成本擴展RAM
4、上電初始化,包括0.01秒微定時器設置,內存清零,中斷設置,如果想增加串口功能也是可以的,51本來就有兩個定時器,無非多寫一個串口中斷服務程序就是了。
5、微定時器中斷服務程序編寫,單片機每0.01秒定時中斷時執行,進行內存時基標志位刷新,用于提醒主程序相應時間到了,基本的時基設計了0.01秒,0.1秒,1秒,10秒,1分鐘,1小時,1天,1周八個時間標志位,其實真沒必要,不過自己編寫架構就是好玩,想設計幾個就設計幾個哈哈!
6、下面是主要PLC邏輯,執行時是不停掃描循環執行的,與真實的PLC運行結構是一樣的,當然咱們編的就要簡單許多了,沒有那么多的功能。而且用匯編編寫執行效率要比C高,目前1K代碼的匯編程序可以寫好多,而如果用C寫再編譯就會大許多,很多時候廉價小單片機就裝不下了。
7、掃描開始是對定時器計數器處理,如果某計時器的相應時基標志位置位,則處理對應程序用定時器的狀態判斷與設置,計數器內存累加,狀態判斷與設置,用于主邏輯執行部分執行;對于計數器主要是判斷是否有計數器復位請求以及進行當前計數值與預設值是否相等判斷,置位相應標志位.
8、輸入掃描,這塊很簡單,就是把輸入IO口復制到內存相應區域內;
9、正式邏輯執行:這塊直接就是按照梯形圖行的概念,每一個梯形圖行,就是一段匯編代碼,為了翻譯時候方便,直接把邏輯就在注釋行內形象的用符號畫出來。
邏輯的翻譯還是有點技巧,實現了基本IO輸入,與或非邏輯,定時器以及計數器功能,外加上升沿下降沿判斷等功能,這些基本的PLC功能都能在這個小架構里面實現,盡管不是十分完美例如定時器狀態更新的時效性由于架構問題還不能達到每次掃描更新,對于上升下降沿的判斷需要更多的內存和語句實現等等,但是對于簡單的應用還是沒有問題的.
10、邏輯輸出,這塊也很簡單,就是把對應的邏輯運算結果輸出到單片機的IO口即可.
11、后期操作部分,也就是每次掃描運算結束后還有余力進行其它需要功能的輸出,這塊在真正PLC里面也是很重要的,應該會進行邏輯效驗,遠程通訊等功能,咱這個就都簡化掉了,僅僅為了測試掃描時間對一個內存變量進行增一操作而已,可以調用看看掃描周期時間是否超過了最小定時器時間等等輔助功能. 實測12M時鐘0.01秒執行了這個小邏輯多達70多遍!
架構有了,具體邏輯要怎么寫,最好還是在PLC模擬器上先試著編寫一下,功能沒問題了再抄到我們的單片機里面來,進行逐句翻譯,因為單片機匯編語言的調試還是很麻煩的,畢竟不直觀,還是在PLC模擬器里面做好了再搬進來比較好。
Keil里面編譯成HEX文件后可以直接刷寫進單片機使用了,真正用之前最好還是要根據單片機的晶振時鐘,再調整一下微定時器的定時參數,盡量符合0.01秒的要求,不要偏差太大,還有一種方法是利用proteus軟件仿真硬件運行也是不錯的。
通過反復修改匯編程序,通過仿真測試到目前為止我們只是完成了PLC芯片邏輯的軟件編寫,下面就可以燒寫進51內核的單片機內實際運行了,這里我使用的是STC的國產單片機,15W408系列,DIP20替換AT89C2051還能多增加幾個IO腳,僅僅幾元,價格便宜,1T內核,性能強勁(之前寫的0.01秒掃描70多次是在仿真環境下,12T的89C2051達到的性能,如果使用STC的1T系列要注意實際運行速度會增加12倍,達到0.01秒掃700多次,有時候太快了也會引起煩惱呵呵),IO可以設定為強推挽,驅動力強,串口直接下載程序,編程方便,對于非專業應用,給DIYer做點小東西還是很合適的.使用STC專用下載線(僅僅十幾塊,比別的芯片下載編程器可便宜多了,甚至使用5元的USB轉TTL串口線也能用,只是需要手動斷電一次而已,專用的下載線增加了自動斷電功能,使下載更方便些)下載進芯片,得到一只帶程序的芯片.
利用面包板搭建測試電路實際驗證邏輯功能,如果邏輯不滿意或者定時時間不合適還可以回去修改程序,重新編譯下裝,直到滿意為止,為了能夠應用到實際環境中,還需要為它配上電源電路,輸入按鍵開關,輸出驅動三極管或繼電器等硬件才能和實際的應用環境配合使用,發揮預想的作用。
實際應用中對于抗干擾還是需要花費一些心思的,干擾來自一下幾個方面:
1、電磁閥動作時候產生的電磁脈沖和反電動勢,這個可以使用二極管做續流,來消除電磁閥斷電反電動勢脈沖,通過增加光耦進行輸出隔離,也可以提高抗干擾性能;
2、對于開關輸入通道要考慮單片機輸入電阻是比較高的,長線容易引入外部干擾,這個問題可以通過在輸入引腳外加1K上拉電阻的方法來降低輸入阻抗,達到抗干擾的目的;
3、電源也是干擾源,因為大功率電機和電磁閥的動作都會造成24V電源的瞬間劇烈波動,盡管單片機的電源消耗不大但是很容易因干擾而復位或者造成輸入輸出不正常等現象,因此電源濾波也很重要,通過示波器可以觀察到當電機或電磁閥動作時,單片機5V電源的波動情況,通過采取增加π型LC濾波,可以極大降低電源引起的干擾.
4 、電磁輻射也要考慮,單片機控制板本體最好增加金屬外殼并接地,抵抗電機電磁閥或廚房用電設備的外部干擾,這就是為什么我喜歡收集金屬糖果糕點盒的原因,呵呵!
對于DIYer來講,有時候想法挺好,試驗也成功,但是實際裝機后卻失敗了,這些可能不是我們做的不好,實際是沒有考慮到復雜的工作環境,真正的產品為什么比我們DIY的成本高,其主要方面就是考慮的實際工作現場的復雜性,真正的核心控制可能很簡單,但是周邊的各種保護很復雜,甚至接錯線了也要考慮到,成本和可靠性就成正比了,希望朋友們DIY快樂!
-
單片機
+關注
關注
6035文章
44554瀏覽量
634669 -
plc
+關注
關注
5010文章
13272瀏覽量
463072 -
定時器
+關注
關注
23文章
3246瀏覽量
114723
原文標題:高手教你如何在單片機上實現PLC邏輯
文章出處:【微信號:mcu168,微信公眾號:硬件攻城獅】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論