首页 > 其他分享 >S7协议转HTTP协议

S7协议转HTTP协议

时间:2024-08-19 16:51:13浏览次数:5  
标签:协议 HTTP vd4 只读 timestamp S7 数据 data 节点

如下来源成都纵横智控-https://www.iotrouter.com/

需求概述

本章要实现一个流程:EG8200采集西门子S7-200Smart的数据,并组装成JSON格式通过HTTP上报应用平台。
要采集的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通信相关参数格式如下:



需求分析

在制作流程时,基础的逻辑是根据数据走向来制作流程。其中主要工作分为三步:
第一步:通过S7协议读取PLC变量数据,得到的数据存储在内存中(西门子节点)
第二步:将数据按照JSON格式进行格式化(函数节点)
第三步:配置HTTP 请求参数​

需求实现

1 采集PLC数据

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

动画.gif

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


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

动画.gif


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

动画.gif

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

2数据格式化

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

1699494702219.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
}


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

动画.gif


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

3通过http周期上报

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

动画.gif

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

标签:协议,HTTP,vd4,只读,timestamp,S7,数据,data,节点
From: https://blog.csdn.net/zonghengzhikong/article/details/141329580

相关文章

  • 11 IIC通讯协议
    目录前言一、IIC介绍1.IIC的时序2.使用IIC对从机寄存器的写操作流程3.使用IIC对从机寄存器的读操作流程二、软件实现IIC协议1.GPIO口配置2.IIC开始信号3.IIC结束信号4.发送数据5.接收数据6.接收ACK响应7.发送ACK和NACK响应8.对寄存器进行写处理9.对寄存器进行读处理三、硬件实现II......
  • Camera MIPI 协议理解
    D-PHY1、传输模式1.LP(Low-Power)模式:用于传输控制信号,最高速率10MHzHS(High-Speed)模式:用于高速传输数据,速率范围[80Mbps,1Gbps]perLane传输的最小单元为1个字节,采用小端(低位字节放到内存的低地址端,高位字节放到内存的高地址端)的方式及LSBfirst,MSBlast(一个芯片的管脚......
  • 遇到403 Forbidden ,服务器端查询后结果是http get查询字符串中包含非法字符
    原文链接:https://blog.csdn.net/mm_hello11/article/details/84261672 报错解释:HTTPGET请求通过查询字符串(即URL中"?"后面的部分)传递参数。如果查询字符串包含非法字符,服务器可能会拒绝请求并返回错误,因为这些非法字符可能会破坏URL的格式或者服务器的安全性。非法字符通常......
  • Java轻松实现跨平台(Windows、Linux)多协议(Twain、Sane)的Web扫描
     由于项目需要,开发在Windows下与Linux下扫描功能,Linux主要是信创的两个系统(UOS、麒麟),研究了一下发现,Windows使用Twain协议与扫描仪通讯,Linux使用的是Sane协议与扫描仪通讯,找到Twain协议和Sane协议的标准文档,英文的,都有大几百页,项目一个月内要求上线,明显没时间慢慢研究,于......
  • CANoe_UDS-boorloader 自动化测试系列(二)基本功能:CAPL实现UDS协议下的CAN报文接收#解析
    目录一、前言二、CAPL实现1、报文接收接收报文函数:2、报文发送发送报文函数:三、总结展望一、前言halle,大家好,我是小鸟鹏。上篇文章《CANoe_UDS-boorloader自动测试系列(二)基本刷写流程》简单介绍了整Bootloader的基本刷写流程,包括具体使用哪些服务实现哪些功能,对......
  • Node.js使用Axios发起http调用
    axios功能比较多,除了基本get/post调用之外,还支持多个接口并发调用、全局配置、拦截器等功能。笔者这里只介绍简单使用方法。安装npminstallaxiosGET请求:constaxios=require('axios');axios.get('http://api.qingyunke.com/api.php',{params:{key:'fre......
  • HttpClient、IHttpClientFactory、HttpClientHandler 和 HttpMessageHandler 的生命周
    在C#中,HttpClient、IHttpClientFactory、HttpClientHandler和HttpMessageHandler的生命周期密切相关,它们共同影响着网络请求的性能、资源管理和可靠性。以下是它们的生命周期分析:1.HttpClient的生命周期默认行为:HttpClient是线程安全的,设计为可以在应用程序的整个生命......
  • 在高并发和高负载场景下,优化 HttpClient
    在高并发和高负载场景下,优化HttpClient的使用至关重要,因为不当的资源管理可能导致性能瓶颈、资源枯竭(如端口耗尽)、和请求延迟等问题。以下是一些优化建议:1.使用IHttpClientFactory管理HttpClient实例复用HttpMessageHandler:通过IHttpClientFactory创建HttpClient实......
  • 在 C# 中处理 HttpClient 实例时,使用单例模式和 IHttpClientFactory,DNS缓存问题
    在C#中处理HttpClient实例时,使用单例模式和IHttpClientFactory都有各自的优缺点,尤其是在高并发情况下。以下是它们的对比及性能考虑:1.单例模式使用HttpClient优势:减少资源消耗:HttpClient是设计为复用的类,创建一个单例可以避免频繁创建和销毁HttpClient实例,从而减......
  • 浅谈MQTT协议
    一、基本介绍MQTT(MessageQueuingTelemetryTransport,消息队列遥测传输)是一种轻量级的消息传输协议,设计用于连接一些使用TCP/IP协议的设备。它被广泛用于物联网(IoT)中,因为其低带宽、低延迟、高可靠性的特点,非常适合于远程设备和移动设备之间的通信。二、关键特性轻量级:M......