0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

教程-西门子S7协议转换为HTTP协议

IOTRouter 来源:IOTRouter 作者:IOTRouter 2024-10-12 16:18 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

需求概述

本章要实现一个流程:EG8200采集西门子S7-200Smart的数据,并组装成JSON格式通过HTTP上报应用平台。

源-(S7转Modbus-https://www.iotrouter.com/news/2150.html)

要采集的PLC点位表如下:

PLC S7-200 Smart
IP 192.168.0.34/102
点表(DB1)
地址 数据类型 属性 名称
V0.0 Boolean 只读 风机1接触器异常
V0.6 Boolean 只读 风机2接触器异常
V1.6 Boolean 只读 风机3接触器异常
V2.5 Boolean 只读 变频器通讯故障
I0.0 Boolean 只读 电机高温报警
I0.1 Boolean 只读 温度状态异常
VD4 Float 只读 油压工程值
VD8 Float 只读 吸入压力工程值
VD12 Float 只读 燃油油位工程值
VD16 Float 只读 机柜温度值
VD20 Float 只读 发动机电压值
VD24 Float 只读 发动机电流值
VD28 Float 只读 发动机工作时间
VD32 Float 只读 泵压工程值
VW120 Unsigned16 只读 本机编号
VW750 Unsigned16 只读 本机组号
VW2402 Unsigned16 只读 电机1温度
VW2404 Unsigned16 只读 电机2温度
VW2406 Unsigned16 只读 电机3温度
VW2408 Unsigned16 只读 风机1温度
VW2410 Unsigned16 只读 风机2温度
VW2412 Unsigned16 只读 风机3温度

HTTP通信相关参数格式如下:

##数据推送
url:192.168.0.32:1880/api/device/reportData
method:POST

JSON格式:
{
  "deviceInfo": {
    "machineNumber": 9301,
    "machineGroupNumber": 1
  },
  "status": {
    "fan1ContactError": true,
    "fan2ContactError": false,
    "fan3ContactError": false,
    "inverterCommError": false,
    "motorHighTempAlarm": false,
    "temperatureStatusError": false
  },
  "data": {
    "oilPressure": 17.83,
    "suctionPressure": 3.7,
    "fuelLevel": 0.23,
    "cabinetTemperature": 237.2,
    "engineVoltage": 415.64,
    "engineCurrent": 65.1,
    "engineRuntime": 72.6,
    "pumpPressure": 85.3,
    "motor1Temperature": 20,
    "motor2Temperature": 19,
    "motor3Temperature": 19,
    "fan1Temperature": 21,
    "fan2Temperature": 33,
    "fan3Temperature": 26
  },
  "timestamp": "2022-7-08 11:28:55"
}

需求分析

在制作流程时,基础的逻辑是根据数据走向来制作流程。其中主要工作分为三步:

第一步:通过S7协议读取PLC变量数据,得到的数据存储在内存中(西门子节点)

第二步:将数据按照JSON格式进行格式化(函数节点)

第三步:配置HTTP 请求参数

wKgZoWcKMT2AIXGSAAAUBcZlQlY587.png

需求实现

1. 采集PLC数据

从节点库拖入一个西门子节点,以及一个调试节点,调试节点用于查看读取到的PLC数据集,方便定位问

wKgZombDBMSAXaAwAAzV2crvgmE057.png

双击西门子节点,根据需求概述的内容填写对应的设置参数,如下图所示:

IP:PLC的IP
端口:102(S7协议通信默认端口102)
采集周期:1000ms(默认2000ms,可自定义)
超时周期:2000ms(默认2000ms,可自定义)

数据点配置(根据帮助文档可以找到对应关系)
V0.0
V0.6
V1.6
V2.5
I0.0
I0.1
VD4
VD8
VD12
VD16
VD20
VD24
VD28
VD32
VW120
VW750
VW2402
VW2404
VW2408
VW2410
VW2412

如果是连续地址,可配置起始地址并填写读取长度即可

如果设置正确,调试窗口会有日志打印,显示的是读取到的数据内容:

wKgaombDBV6AGjboAAz30bMjHmA001.png

有的时候PLC数据点比较多,手动依次录入比较繁琐。节点支持数据点的导入导出或者参数传递的方式来读取:

wKgZoWcKMZWAemq1ABG6MpMXYKA822.png

本例程用到的传参方案,函数节点内的代码如下:

msg.payload = [
    { func: "ReadBoolArray", body: { name: "", address: "V0", length: 8 } },
    { func: "ReadBoolArray", body: { name: "", address: "V1", length: 8 } },
    { func: "ReadBoolArray", body: { name: "", address: "V2", length: 8 } },
    { func: "ReadFloatArray", body: { name: "", address: "VD4", length: 8 } },
    { func: "ReadUInt16", body: { name: "", address: "VW120" } },
    { func: "ReadUInt16", body: { name: "", address: "VW750" } },
    { func: "ReadUInt16Array", body: { name: "", address: "VW2402", length: 6 } },
    { func: "ReadBoolArray", body: { name: "", address: "I0", length: 8 } }
]
return msg;

2. 数据格式化

根据步骤引导,在调试窗口可以看到读到的PLC数据如下:

wKgZoWcKMbSABcQeAAGpKSe5_oI754.png

因为应用平台已经规定了数据必须按照JSON格式上报。接下来使用函数节点Javascrip代码将数据进行格式化,代码如下:

class DeviceReport {
    constructor(machineNumber, machineGroupNumber) {
        this.deviceInfo = {
            machineNumber: machineNumber,
            machineGroupNumber: machineGroupNumber
        };
        this.status = {
            fan1ContactError: 0,
            fan2ContactError: 0,
            fan3ContactError: 0,
            inverterCommError: 0,
            motorHighTempAlarm: 0,
            temperatureStatusError: 0
        };
        this.data = {
            oilPressure: 0,
            suctionPressure: 0,
            fuelLevel: 0,
            cabinetTemperature: 0,
            engineVoltage: 0,
            engineCurrent: 0,
            engineRuntime: 0,
            pumpPressure: 0,
            motor1Temperature: 0,
            motor2Temperature: 0,
            motor3Temperature: 0,
            fan1Temperature: 0,
            fan2Temperature: 0,
            fan3Temperature: 0
        };
        this.timestamp = null;
    }

    // 设置状态数据(1表示异常,0表示正常)
    setStatusData(statusData) {
        this.status = statusData;
    }

    // 设置传感器数据
    setSensorData(sensorData) {
        this.data = sensorData;
    }

    // 设置时间戳
    setTimestamp(timestamp) {
        this.timestamp = timestamp;
    }
    generateReport() {
        return {
            deviceInfo: this.deviceInfo,
            status: this.status,
            data: this.data,
            timestamp: this.timestamp
        };
    }
}

function dateFormat(fmt, timestamp) {
    let ret;
    const opt = {
        "Y+": timestamp.getFullYear().toString(), // 年
        "m+": (timestamp.getMonth() + 1).toString(),  // 月
        "d+": timestamp.getDate().toString(), // 日
        "H+": timestamp.getHours().toString(), // 时
        "M+": timestamp.getMinutes().toString(), // 分
        "S+": timestamp.getSeconds().toString() // 秒
    };
    for (let k in opt) {
        ret = new RegExp("(" + k + ")").exec(fmt);
        if (ret) {
            fmt = fmt.replace(ret[1], (ret[1].length == 1) ? (opt[k]) : (opt[k].padStart(ret[1].length, "0")))
        };
    };
    return fmt;
}
function setValue(data) {
    var myDeviceReport = new DeviceReport(data.VW120, data.VW750)
    var v0 = data.V0
    var v1 = data.V1
    var v2 = data.V2
    var i0 = data.I0
    var vd4 = data.VD4
    var vd2402 = data.VW2402
    const fmt = dateFormat("YYYY-mm-dd HH:MM:SS", new Date())
    try {
        // 设置状态数据
        const statusData = {
            fan1ContactError: v0[0],
            fan2ContactError: v0[6],
            fan3ContactError: v1[6],
            inverterCommError: v2[5],
            motorHighTempAlarm: i0[0],
            temperatureStatusError: i0[1]
        }
        myDeviceReport.setStatusData(statusData)

        // 设置传感器数据
        const sensorData = {
            oilPressure: vd4[0],
            suctionPressure: vd4[1],
            fuelLevel: vd4[2],
            cabinetTemperature: vd4[3],
            engineVoltage: vd4[4],
            engineCurrent: vd4[5],
            engineRuntime: vd4[6],
            pumpPressure: vd4[7],
            motor1Temperature: vd2402[0],
            motor2Temperature: vd2402[1],
            motor3Temperature: vd2402[2],
            fan1Temperature: vd2402[3],
            fan2Temperature: vd2402[4],
            fan3Temperature: vd2402[5]
        }
        myDeviceReport.setSensorData(sensorData)
        // 设置时间戳
        myDeviceReport.setTimestamp(fmt)
        //生成JSON对象返回
        return myDeviceReport.generateReport()
    } catch (err) {
        node.error(err.message);
        return null
    }

}
var plcData = msg.payload
if (setValue(plcData)){
    msg.payload = JSON.stringify(setValue(plcData),null,2)
    return msg
}

复制以上代码,粘贴到函数节点内,部署后即可看到效果:

wKgaoWcKMciAHmhAABAECOnz8Go273.png

可以看到,已经将读到的PLC数据,按照需求要求转换成了最终的JSON格式,且对数据进行了一定程度的计算(两位小数)。此处只是函数节点的冰山一角,因为支持Javascrip语言编程,几乎你能想到的任何功能都可以在这里实现。

3. 通过http周期上报

拖入一个HTTP节点,根据提示进行配置地址和请求方式,即可实现数据上报:

wKgaoWcKMdOAaHycAA5n4n7XdF0777.png

服务端返回成功,至此,数据上报已经完成,很简单几步即可实现:采集PLC数据并按照自定义JSON格式上报。

源码

所有的流程支持以json格式导入导出,方便与其他人分享做好的流程。本章节的流程json文件如下,复制后在菜单栏右上角选择导入粘贴即可,导出同理

[{"id":"edf0c4c538469caa","type":"Siemens","z":"5bb1b94e3403e2f2","name":"","protocol":"iplink_SiemensS7","IPAddress":"192.168.0.34","DestPort":"102","IPLinkTimeout":"2000","IPCommTimeout":"2000","Spname":"COM10","Baudrate":"9600","Databits":"8","Stopbit":"1","Paritybit":"0","RTSEnable":false,"SpLinktimeout":"2000","SpIntertimeout":"-1","workMode":"read","readMode":"trigger","readCyc":"1000","vartable":[],"SiemensS7Model":"5","SiemensS7ConnectionType":"1","SiemensS7Rack":"0","SiemensS7Slot":"0","SiemensS7LocalTSAP":"102","SiemensS7DestTSAP":"4D57","SiemensPPIStation":"2","stringvar":[],"customName":"Siemens:S7-S200Smart","x":510,"y":1080,"wires":[["be890e0383a04306"]]},{"id":"90be80aa485c48ae","type":"debug","z":"5bb1b94e3403e2f2","name":"调试 22","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":1020,"y":1080,"wires":[]},{"id":"2485d94e74e61614","type":"function","z":"5bb1b94e3403e2f2","name":"函数计算 18","func":"msg.payload = [n    { func: "ReadBoolArray", body: { name: "", address: "V0", length: 8 } },n    { func: "ReadBoolArray", body: { name: "", address: "V1", length: 8 } },n    { func: "ReadBoolArray", body: { name: "", address: "V2", length: 8 } },n    { func: "ReadFloatArray", body: { name: "", address: "VD4", length: 8 } },n    { func: "ReadUInt16", body: { name: "", address: "VW120" } },n    { func: "ReadUInt16", body: { name: "", address: "VW750" } },n    { func: "ReadUInt16Array", body: { name: "", address: "VW2402", length: 6 } },n    { func: "ReadBoolArray", body: { name: "", address: "I0", length: 8 } }n]nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":310,"y":1080,"wires":[["edf0c4c538469caa"]]},{"id":"8db3c718ecac3ed7","type":"inject","z":"5bb1b94e3403e2f2","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":150,"y":1080,"wires":[["2485d94e74e61614"]]},{"id":"be890e0383a04306","type":"function","z":"5bb1b94e3403e2f2","name":"函数计算 19","func":"class DeviceReport {n    constructor(machineNumber, machineGroupNumber) {n        this.deviceInfo = {n            machineNumber: machineNumber,n            machineGroupNumber: machineGroupNumbern        };n        this.status = {n            fan1ContactError: 0,n            fan2ContactError: 0,n            fan3ContactError: 0,n            inverterCommError: 0,n            motorHighTempAlarm: 0,n            temperatureStatusError: 0n        };n        this.data = {n            oilPressure: 0,n            suctionPressure: 0,n            fuelLevel: 0,n            cabinetTemperature: 0,n            engineVoltage: 0,n            engineCurrent: 0,n            engineRuntime: 0,n            pumpPressure: 0,n            motor1Temperature: 0,n            motor2Temperature: 0,n            motor3Temperature: 0,n            fan1Temperature: 0,n            fan2Temperature: 0,n            fan3Temperature: 0n        };n        this.timestamp = null;n    }nn    // 设置状态数据(1表示异常,0表示正常)n    setStatusData(statusData) {n        this.status = statusData;n    }nn    // 设置传感器数据n    setSensorData(sensorData) {n        this.data = sensorData;n    }nn    // 设置时间戳n    setTimestamp(timestamp) {n        this.timestamp = timestamp;n    }n    generateReport() {n        return {n            deviceInfo: this.deviceInfo,n            status: this.status,n            data: this.data,n            timestamp: this.timestampn        };n    }n}nnfunction dateFormat(fmt, timestamp) {n    let ret;n    const opt = {n        "Y+": timestamp.getFullYear().toString(), // 年n        "m+": (timestamp.getMonth() + 1).toString(),  // 月n        "d+": timestamp.getDate().toString(), // 日n        "H+": timestamp.getHours().toString(), // 时n        "M+": timestamp.getMinutes().toString(), // 分n        "S+": timestamp.getSeconds().toString() // 秒n    };n    for (let k in opt) {n        ret = new RegExp("(" + k + ")").exec(fmt);n        if (ret) {n            fmt = fmt.replace(ret[1], (ret[1].length == 1) ? (opt[k]) : (opt[k].padStart(ret[1].length, "0")))n        };n    };n    return fmt;n}nfunction setValue(data) {n    var myDeviceReport = new DeviceReport(data.VW120, data.VW750)n    var v0 = data.V0n    var v1 = data.V1n    var v2 = data.V2n    var i0 = data.I0n    var vd4 = data.VD4n    var vd2402 = data.VW2402n    const fmt = dateFormat("YYYY-mm-dd HH:MM:SS", new Date())n    try {n        // 设置状态数据n        const statusData = {n            fan1ContactError: v0[0],n            fan2ContactError: v0[6],n            fan3ContactError: v1[6],n            inverterCommError: v2[5],n            motorHighTempAlarm: i0[0],n            temperatureStatusError: i0[1]n        }n        myDeviceReport.setStatusData(statusData)nn        // 设置传感器数据n        const sensorData = {n            oilPressure: vd4[0],n            suctionPressure: vd4[1],n            fuelLevel: vd4[2],n            cabinetTemperature: vd4[3],n            engineVoltage: vd4[4],n            engineCurrent: vd4[5],n            engineRuntime: vd4[6],n            pumpPressure: vd4[7],n            motor1Temperature: vd2402[0],n            motor2Temperature: vd2402[1],n            motor3Temperature: vd2402[2],n            fan1Temperature: vd2402[3],n            fan2Temperature: vd2402[4],n            fan3Temperature: vd2402[5]n        }n        myDeviceReport.setSensorData(sensorData)n        // 设置时间戳n        myDeviceReport.setTimestamp(fmt)n        //生成JSON对象返回n        return myDeviceReport.generateReport()n    } catch (err) {n        node.error(err.message);n        return nulln    }nn}nvar plcData = msg.payloadnif (setValue(plcData)) {n    msg.payload = JSON.stringify(setValue(plcData), null, 2)n    return msgn}n","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":710,"y":1080,"wires":[["d140dc012c0cd68f"]]},{"id":"d140dc012c0cd68f","type":"http request","z":"5bb1b94e3403e2f2","name":"","method":"POST","ret":"txt","paytoqs":"ignore","url":"192.168.0.32:1880/api/device/reportData","tls":"","persist":false,"proxy":"","insecureHTTPParser":false,"authType":"","senderr":false,"headers":[],"x":860,"y":1080,"wires":[["90be80aa485c48ae"]]}]


审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 西门子
    +关注

    关注

    98

    文章

    3272

    浏览量

    119754
  • HTTP
    +关注

    关注

    0

    文章

    531

    浏览量

    34860
  • 边缘计算
    +关注

    关注

    22

    文章

    3473

    浏览量

    52703
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    钡铼技术BL118 Node-Red边缘计算网关西门子PLC S7协议使用方法

    一、概述 node-red-contrib-s7用于与 Siemens S7 PLC 交互的 Node-RED 节点。S7读数据 S7写数据 S7
    的头像 发表于 12-03 16:48 474次阅读
    钡铼技术BL118 Node-Red边缘计算网关<b class='flag-5'>西门子</b>PLC <b class='flag-5'>S7</b><b class='flag-5'>协议</b>使用方法

    风电场智能化管控:EtherCAT转ProfiNet协议助力贝加莱X20CP3586与西门子S7-1500协同

    某大型能源企业旗下现代化风电场,以贝加莱 X20CP3586 控制器(EtherCAT 主站)控制风机,西门子 S7-1500 系列 PLC(ProfiNet 主站)构建中央监控系统,塔讯 TX 161-RE-ECS/PNS 协议
    的头像 发表于 09-12 14:09 314次阅读
    风电场智能化管控:EtherCAT转ProfiNet<b class='flag-5'>协议</b>助力贝加莱X20CP3586与<b class='flag-5'>西门子</b><b class='flag-5'>S7</b>-1500协同

    承担CANOPEN转PROFINET协议转换功能的网关与台达伺服器的连接

    西门子S7 - 1200系列PLC可编程逻辑控制器(PLC),需与具备CANOPEN通讯功能的伺服驱动器设备进行连接。西门子的PLC采用PROFINET实时以太网通讯协议,若要连接CA
    的头像 发表于 07-24 18:01 375次阅读
    承担CANOPEN转PROFINET<b class='flag-5'>协议</b><b class='flag-5'>转换</b>功能的网关与台达伺服器的连接

    Profibus DP转DeviceNet实现西门子S7–300与罗克韦尔PLC在汽车制造车间的跨协议协同控制案例

    汽车制造是一个高度自动化且设备众多的行业,不同设备常采用不同通信协议。在某汽车装配车间,生产线的部分设备由西门子 S7 - 300 系列 PLC 通过 Profibus DP 主站进行控制,如自动化
    的头像 发表于 07-23 21:48 295次阅读
    Profibus DP转DeviceNet实现<b class='flag-5'>西门子</b><b class='flag-5'>S7</b>–300与罗克韦尔PLC在汽车制造车间的跨<b class='flag-5'>协议</b>协同控制案例

    ProfibusDP转DeviceNet施耐德PLC联合西门子S7–1200提升物流仓储货物分拣效率技术案例

    DeviceNet转 ProfibusDP网关在物流仓储中心的自动化程度不断提升,众多设备协同作业。某大型物流仓库,其货物分拣区由西门子 S7 - 1200 系列 PLC 通过 Profibus
    的头像 发表于 07-23 21:45 388次阅读
    ProfibusDP转DeviceNet施耐德PLC联合<b class='flag-5'>西门子</b><b class='flag-5'>S7</b>–1200提升物流仓储货物分拣效率技术案例

    西门子PLC(S7-1200/1500/300/400)的数据采集与监控方案

    西门子PLC S7-1200、S7-1500、S7-300/400型号设备,常用协议:PPI(Process Communication I
    的头像 发表于 07-04 10:13 973次阅读

    CANopen转PROFINET网关:西门子S7-1200 PLC与欧姆龙NJ系列PLC通信方案

    进行通信,而另一部分则依赖 CANopen协议 。为实现不同协议设备之间的无缝通信与协同工作,引入高效可靠的 协议转换网关 成为当务之急。 二、设备选型 1. ROFINET
    的头像 发表于 06-12 15:25 543次阅读
    CANopen转PROFINET网关:<b class='flag-5'>西门子</b><b class='flag-5'>S7</b>-1200 PLC与欧姆龙NJ系列PLC通信方案

    如何破解三菱PLC与西门子PLC的通讯难题

    在工业自动化领域,不同品牌PLC之间的通讯一直是工程师们关注的焦点。三菱PLC与西门子PLC作为市场主流设备,常因协议差异导致数据交互困难。当现场需要将三菱FX系列PLC通过485接口与西门子
    的头像 发表于 06-09 17:14 807次阅读
    如何破解三菱PLC与<b class='flag-5'>西门子</b>PLC的通讯难题

    Profinet转DeviceNet网关协议转换的技术实现与应用分析

    通过DeviceNet协议与AB的PLC进行通讯。现因车间升级需求,需将PLC更换为西门子1500系列。考虑到西门子1500可选择转ProfibusDP或者Profinet
    的头像 发表于 05-29 09:16 540次阅读
    Profinet转DeviceNet网关<b class='flag-5'>协议</b><b class='flag-5'>转换</b>的技术实现与应用分析

    工业智能网关可以采集西门子PLC吗

    、台达等。 具体而言,工业智能网关采集西门子PLC数据的过程如下: 连接方式:通过串口或网口将工业智能网关与西门子PLC连接,并确保两者处于同一网段内。 协议支持:物通博联工业智能网关支持多种通信
    的头像 发表于 05-26 09:14 681次阅读

    西门子S7 PLC通过深控技术无点表工业网关实现数据采集与智能决策方案

    深控技术“不需要点表的工业数采网关”针对西门子S7系列PLC(包括S7-300、S7-400、S7-1200、
    的头像 发表于 05-23 10:44 562次阅读

    MCGS触摸屏与西门子S7系列PLC以太网通信

    随着计算机控制技术的不断发展,可编辑逻辑控制 器的应用也在不断普及,成为自动化技术的重要组成, 其中西门子 S7 系列的 PLC 在我国工业控制中也占有了很 大的比重。触摸屏作为一种直观、方便的人
    的头像 发表于 03-20 14:19 3120次阅读
    MCGS触摸屏与<b class='flag-5'>西门子</b><b class='flag-5'>S7</b>系列PLC以太网通信

    Profinet转EtherCAT深度解读网关模块如何协议转换赋能西门子PLC与伺服驱动高效协作案例​

    的其它设备或连接到ProfiNetPLC上,并在正常运行中支持EtherCAT协议。本产品可作为EtherCAT主站,做为西门子S7-1200系列PLC的从站并在监控系统中支持PROFINET
    的头像 发表于 03-14 10:58 640次阅读
    Profinet转EtherCAT深度解读网关模块如何<b class='flag-5'>协议</b><b class='flag-5'>转换</b>赋能<b class='flag-5'>西门子</b>PLC与伺服驱动高效协作案例​

    西门子S7-200SMART与WINCC如何通信?老工控人这样做!

    :RJ45接口 供电:12-24VDC 通讯协议:ModbusTCP/IP协议 传输距离:100米,1KM 本方案以WinCC和2台西门子S7-200SMART PLC为例,在Modb
    的头像 发表于 02-25 10:06 2205次阅读
    <b class='flag-5'>西门子</b><b class='flag-5'>S7</b>-200SMART与WINCC如何通信?老工控人这样做!

    西门子S7-200与变频器之间无线MODBUS通讯实例

    、易于编程和扩展性强等特点,被广泛应用于各种工业控制场合。而MODBUS作为一种标准的工业通讯协议,也因其简单、可靠而被广泛接受。本案例将详细介绍如何通过无线MODBUS通讯方式实现西门子S7-200 PLC与变频器之间的数据交
    的头像 发表于 02-19 11:55 1465次阅读
    <b class='flag-5'>西门子</b><b class='flag-5'>S7</b>-200与变频器之间无线MODBUS通讯实例