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和数据库的支持

PLC通讯的现状

 

通过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是免安装的,直接放到文件夹内即可运行,运行需要下面的支持环境

  1. Microsoft .NET Framework 4.6.1或以上
  2. 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 是完全开源免费的。

带C脚本支持的工控组态软件,它的特色是借鉴了iFix、组态王(亚控)、Force Control(力控)的设计思想。画面图形采用脚本驱动,脚本是它的最大特色,支持标准C的所有运算符,包括的标准C的运算符优先级和结合律。支持宏定义自定义函数。在图形方面采用了GDI+技术,图形交换文件支持ACAD的DWG、DXF格式,其他JPG、GIF、BMP、EMF、WMF等图形格式。支持图形动画脚本向导,不需专业培训即可使用。 1、借鉴了iFix、组态王、力控、的设计思想。 脚本语言支持:采用标准C脚本,支持自定义函数,画面图形采用脚本驱动,系统预制了近100个系统函数包括通用函数和动画控制函数。 2、图形处理采用GDI+技术和GDI混合技术,支持整体、局部的编辑状态和运行状态任意角度旋转。 3、交换文件图像、图形格式支持ACAD的DWG、DXF格式,其他JPG、GIF、BMP、EMF、WMF等图形格式。 4、可重用的子图功能,可以管理和使用多个子图库。 5、具有图形动画脚本向导,自动生成和维护脚本,几乎不需要专门培训。 6、编辑时可立即模拟动画效果,所见即所得。 7、例子工程中有多个例子画面。分别是:行星齿轮、模拟台球、太阳系、太阳系和小行星、模拟人走路、管道、仪表、路灯控制、游戏-打鸟、子图演示、缩放演示、ACAD图形、图片运动等。 注:软件包里包含详细的资料 新版的请到http://www.kipway.com下载
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值