javascript
JavaScript如何对欧姆龙、三菱、施耐德等PLC进行读写通讯控制
思考
說到 Javascript,大部分人都會將其和網頁Web,特效,前端掛鉤,但隨著UI技術的不斷發展,以及計算機摩爾定律的推進, Javascript 也逐步開始承擔更多的功能,如支持游戲的3D引擎 Three.js 、Babylon.js,支持深度學習的引擎?TensorFlow.js 、keras.js ,還有大型的數據分析和可視化庫?D3.js 、Aperture JS。所以通過 Javascript 完成的事情會越來越多。
再隨著 Node.js?的發展,用Javascript來完成一個工業控制領域的專業系統也不是不可能的。
可能傳統的思維,對于工業控制和數據分析這部分,一般會使用Java、C#這種老牌的開發工具來進行開發,但明顯對于現在的生產環境,Java或者C#的可變性,以及其擴展工具的豐富程度,遠沒有Javascript、Python這類型的高了,混合編程是個很好的解決方案,但 Java 和 C# 這種開發工具的學習成本,也不得不說比 Javascript 高多了。
我們工業自動化項目組就使用了 PHP 和 Python 完成了一整套MES系統(制造業執行系統),并成功的實施在多個工廠和廠區的項目中,其開發,實施與運維成本分別比傳統Java、C#的低上40%、30%、15%;以后在工業自動化的項目上,通過 Javascript?出現類似三維家,微信小程序這種行業顛覆的解決方案的公司,也并不是不可能,可能你會在未來不久, 就會看到通過純 Javascript Webbrowser 機制完成的SCADA系統、MES系統,WCS系統。
目前情況
工業自動化繞不開一個關鍵元素就是PLC,不管是機器人,采集系統,還是輸送線,單機設備,PLC進行電氣化控制是現在的金標準,而與互聯網的解決方案不一樣,PLC并沒有一個標準的控制模式,也就是說沒有一個標準的通訊協議,每家PLC的廠家都為了打造自己的壁壘,而創建了千奇百怪的通訊協議,如歐姆龍的FINS協議和C-Mode協議,三菱的MC協議,松下的Mewtocol協議,西門子的S7系列的通訊協議,還有施耐德的Modbus協議(題外話,Modbus就是施耐德創立的協議標準),而工業自動化現場,不同的設備廠家會使用不同品牌,不同型號的PLC,而且連接方式也有不同,如RS232鏈路的,RS485鏈路的,以太網鏈路的。
這個時候,通訊的中間件就應運而生,這類型的通訊中間件,也叫組態軟件,如知名的 KepServer、Matrikon(好像我也就只知道這兩個),其可以通過不同的協議與PLC進行連接,并且通過OPCUA協議開放出讀寫控制權限給第三方系統,又或者放到數據庫某張表上,與其他系統共享點位。
如圖 方案1 、方案2;因此,這里的第三方系統,則無法使用Javascript直接完成,因為 Javascript for Browser 并沒有OPCUA、OPCDA和數據庫的支持
?
通過Javascript與PLC進行通訊
LECPServer是一個開源項目,他將OPCUA、OPCDA和數據庫的中間接口,換成了更有利于互聯網方式的 WebAPI 服務,所以只需要通過?HTTP POST ,就可以通過純 JS 代碼,完成PLC通訊、數據采集、系統控制和監控展示。
LECPServer 全稱 Leanboard Equipment Communication Proxy Server 是一款基于 JLean 框架開發的高性能工業用組態服務軟件,可以通過該組態軟件,鏈接市面上90%的PLC,通過HTTP協議通聯PLC的讀寫,使用戶能夠通過一個直觀的用戶界面來連接、管理、監視和控制不同的自動化設備和軟件應用程序。
安裝和環境
首先,可以先到官網下載一個 LECPServer的最新版?http://www.lecpserver.com/downloads/LECPServer.zip
LECPServer是免安裝的,直接放到文件夾內即可運行,運行需要下面的支持環境
下載連接我也放在下面
Microsoft .NET Framework 4.6.1?https://dotnet.microsoft.com/download/dotnet-framework/thank-you/net461-web-installer
Visual C++ Redistributable Packages for Visual Studio 2013?https://www.microsoft.com/zh-cn/download/details.aspx?id=40784
安裝完成后,雙擊 LECPServer.exe 就可以啟動程序了
配置部分(歐姆龍 CP1H)
我們通過以太網連接歐姆龍CP1H,PLC的IP設置為192.168.3.20,本機IP設置為192.168.3.202
通過LECPServer的配置界面,配置對應的參數,如圖:
?然后點擊應用,當你看到設備欄的列表指示為綠色,則說明PLC已經正式連接成功了
?這時候我們可以通過HTTP POST的調試工具,如POSTMAN,HTTP Debug來測試下是否能正常讀寫,我們這里選用LECPServer自帶的HTTP調試器。
我們先發送 plc_read_node 命令查看D0000的值,同樣,我們也可以通過 plc_write_node 來配置節點的值。
代碼部分
直接上 Javascript 的代碼:
// 獲取當前時間 yyyy-mm-dd hh:mm:ss 格式 function get_datatime_by_yyyymmddhhmmss() {let d = new Date();return d.getFullYear() + "-" + d.getMonth() + "-" + d.getDate() + " " + d.getHours() + ":" + d.getMinutes() + ":" + d.getSeconds(); }// 將獲得的值轉成echart的data格式 function node_val_to_data(v) {let now = new Date();return {name: now.toString(),value: [get_datatime_by_yyyymmddhhmmss() ,Math.round(v)]}; }option = {title: {text: '動態數據 + 時間坐標軸'},tooltip: {trigger: 'axis',formatter: function (params) {params = params[0];var date = new Date(params.name);return date.getDate() + '/' + (date.getMonth() + 1) + '/' + date.getFullYear() + ' : ' + params.value[1];},axisPointer: {animation: false}},xAxis: {type: 'time',splitLine: {show: true}},yAxis: {type: 'value',boundaryGap: [0, '100%'],splitLine: {show: true}},series: [{name: '模擬數據',type: 'line',showSymbol: false,hoverAnimation: false,data: data}] };// 數據 array var data = [];setInterval(function () {// LECPServer的WebAPI服務地址 端口默認為8088let url = "http://127.0.0.1:8088";$.ajax({url: url,// 讀取PLC節點數據data: JSON.stringify({"action":"plc_read_node", "node":"NODES.CP1H.D0000"}),contentType: "application/x-www-form-urlencoded",type: 'POST',timeout: 2000,success: function (response) {// 解析節點數據// 數據長度是1,因此拿v[0]的數據即可v = JSON.parse(response);data.push(node_val_to_data(v['rtval'][0]));},error: function (x, t, m) {console.log(x);}});// 刷新EChartmyChart.setOption({series: [{data: data}]}); }, 500);其核心通訊就是ajax部分,獲取PLC數據的API接口;代碼可以直接放在 EChart 的調試窗口直接運行,如圖
傳送門
LECPServer的官網站點 http://www.lecpserver.com
LECPServer的使用手冊 http://www.lecpserver.com:3001
LECPServer的Github地址?https://github.com/xeden3/LECPServer?
是的,沒看錯,LECPServer 是完全開源免費的。
總結
以上是生活随笔為你收集整理的JavaScript如何对欧姆龙、三菱、施耐德等PLC进行读写通讯控制的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Atitti 大话存储读后感 attil
- 下一篇: CSS中的text-shadow。