思考
说到 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或以上
- Visual C++ Redistributable Packages for Visual Studio 2013
下载连接我也放在下面
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服务地址 端口默认为8088
let 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);
}
});
// 刷新EChart
myChart.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 是完全开源免费的。