APP源码。 支持S7-200Smart,S7-300,S7-400CPU通讯。 支持博途S7-1200,S7-1500CPU通讯。 用LIinux或Unbutu系统,使用Android studio编写。 支持安卓手机。 支持阿里云物联网平台。

这个项目最核心的当属PLC通讯模块。针对不同型号的西门子PLC,底层用了两套协议并行处理:

// S7-200Smart/S7-300/400通讯配置
S7Connector s7200Connector = TCPConnector.getConnector()
    .withHost("192.168.1.10")
    .withPort(102)
    .withRack(0)
    .withSlot(2)
    .build();

// 博途系列使用S7CommPlus协议
S7PlusDriver s1500Driver = new S7PlusDriver()
    .setConnectionType(S7PlusConnectionType.BASIC)
    .setTargetCpuType(CPUType.S71500);

这里有个坑要注意:S7-1200/1500在博途环境需要先启用"允许来自远程对象的PUT/GET通信"。代码里用的s7netty开源库封装了协议栈,比直接操作PDU省事不少。实测在千兆局域网下,300ms内能完成一轮数据读写。

安卓端的网络权限配置容易被新手忽略,在AndroidManifest.xml里记得加:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

阿里云物联网接入这块,推荐用官方SDK做二次封装。关键代码其实就三板斧:

// 初始化连接
val connection = MqttConnection(
    productKey = "你的PK",
    deviceName = "设备名",
    deviceSecret = "密钥"
)

// 数据上报
fun uploadPLCData(tag: String, value: Any) {
    val payload = JSONObject()
        .put("ts", System.currentTimeMillis())
        .put(tag, value)
    connection.publish("/sys/${productKey}/${deviceName}/thing/event/property/post", payload)
}

实测发现JSON格式传输效率不高,后来改用Protocol Buffers序列化,数据包体积直接缩小60%。不过要注意安卓端的protobuf-gradle插件版本要和编译环境兼容,这坑我卡过两天...

APP源码。 支持S7-200Smart,S7-300,S7-400CPU通讯。 支持博途S7-1200,S7-1500CPU通讯。 用LIinux或Unbutu系统,使用Android studio编写。 支持安卓手机。 支持阿里云物联网平台。

项目在Ubuntu 22.04 + Android Studio Flamingo环境下开发,Gradle配置需要特别注意NDK版本:

android {
    ndkVersion "25.2.9519653"
    externalNativeBuild {
        cmake {
            cppFlags "-std=c++17"
        }
    }
}

目前已经实现的功能包括:PLC寄存器轮询、报警推送、历史数据缓存(用Room做的本地持久化)、云端双向通信。在华为Mate40上测试,连续运行72小时内存占用稳定在80MB左右。

完整项目在Github开源了(地址见评论区),下个版本打算加入OPC UA支持。欢迎PLC老司机们来提PR,或者分享你们在设备通信中遇到的奇葩问题——上周刚解决个1500PLC的TSAP地址冲突问题,这酸爽...

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐