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 是完全开源免费的。

  • 8
    点赞
  • 62
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
### 回答1: 在JavaScript中,可以使用File API来实现对txt文件的读写操作。 1. 读取txt文件: 通过FileReader对象可以读取txt文件的内容。首先,需要使用<input type="file">元素让用户选择要读取的文件。 HTML代码: ``` <input type="file" id="txtFileInput"> ``` JavaScript代码: ```javascript const txtFileInput = document.getElementById('txtFileInput'); txtFileInput.addEventListener('change', readFile); function readFile() { const file = txtFileInput.files[0]; const reader = new FileReader(); reader.onload = function(e) { const contents = e.target.result; console.log(contents); // 在控制台输出读取的txt文件内容 }; reader.readAsText(file); } ``` 2. 写入txt文件: 使用File API的Blob对象可以将文本内容写入到txt文件中。 JavaScript代码: ```javascript const contents = "写入txt文件的内容"; const blob = new Blob([contents], { type: 'text/plain' }); const link = document.createElement('a'); link.href = URL.createObjectURL(blob); link.download = 'output.txt'; document.body.appendChild(link); link.click(); document.body.removeChild(link); ``` 以上就是使用JavaScript实现对txt文件的读写操作的方法。通过这些方法,我们可以读取并处理txt文件的内容,也可以将文本内容写入到txt文件中。这种方式适用于较小的txt文件操作,如果处理大型文件,可能需要使用其他方法。 ### 回答2: 在JavaScript中,我们可以使用File API来对txt文件进行读写操作。首先,要读取一个txt文件,我们可以使用FileReader对象。我们需要先创建一个input标签,为其添加一个change事件监听器,当用户选择一个txt文件时,该事件会触发。在事件处理程序中,我们可以通过event.target.files来获取用户选择的文件。接下来,我们可以创建一个FileReader对象,并使用它的readAsText()方法来将文件内容读取为文本。读取完成后,可以使用该对象的result属性来获取文件的内容。 例如,以下是一个读取txt文件的示例: ```javascript // HTML <input type="file" id="fileInput"> // JavaScript document.getElementById("fileInput").addEventListener("change", function(event) { var file = event.target.files[0]; var reader = new FileReader(); reader.onload = function(e) { var contents = e.target.result; console.log(contents); }; reader.readAsText(file); }); ``` 接下来,我们来看看如何写入txt文件。我们可以使用Blob对象来创建一个新的txt文件,并向其中写入文本内容。我们可以使用URL.createObjectURL()方法来创建一个临时的URL,然后将其分配给一个a标签的href属性,这样用户就可以单击该链接来下载该txt文件。 以下是一个写入txt文件的示例: ```javascript var text = "Hello, World!"; var filename = "example.txt"; var blob = new Blob([text], { type: "text/plain" }); var link = document.createElement("a"); link.download = filename; link.href = URL.createObjectURL(blob); link.click(); // 释放URL对象 URL.revokeObjectURL(link.href); ``` 通过上述方法,我们可以在JavaScript中对txt文件进行读写操作。
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值