wemos d1采集台达hmc资料上传到mqtt服务器
硬件连线如下图
台达hmc的通讯设置和界面分别如下图
wemos端代码如下
//wemos d1通过modbus读取台达hmc数据用mqtt上传到树莓派上mqtt服务器
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include<ArduinoJson.h>
#include<ModbusMaster.h>
ModbusMaster node;
uint8_t result;
const char* ssid = "wifi名称";
const char* password = "wifi密码";
const char* mqtt_server = "192.168.10.82"; // 服务器地址
const int port = 1883;//服务器端口号
const char* topic_name = "/public/TEST/";
const char*client_id = "wemos001";
unsigned long lastSend;
uint16_t ReceivedData[14] = {0};
/*char类型的数组在字符数组中最后一位为转移字符'\0'(也被成为空字符),该字符表示字符串已结束.
char array[10] = "cnblogs";
虽然只有7个字节,但是字符串长度为8个字节。*/
char robbotID[5];
char machineID[5];
char mouldID[11];
int state;
float cycltime;
float robottime;
char publishmsg[200];
WiFiClient espclient;
PubSubClient client(espclient);
//获取Modbus数据
void GetModbusData()
{ result = node.readHoldingRegisters(2000,12);//从台达hmc上M$0开始读12个字
if(result == node.ku8MBSuccess)
{
for(int i=0;i<12;i++)
{
ReceivedData[i] = node.getResponseBuffer(i);
Serial.print("ReceivedData[");
Serial.print(i);
Serial.print("]=");
Serial.println(ReceivedData[i],HEX);
}
for(int j=0;j<2;j++)
{
robbotID[2*j] = char(lowByte(ReceivedData[j]));
robbotID[2*j+1] = char(highByte(ReceivedData[j]));
}
for(int k=0;k<2;k++)
{
machineID[2*k] = char(lowByte(ReceivedData[k+2]));
machineID[2*k+1] = char(highByte(ReceivedData[k+2]));
}
for(int l=0;l<5;l++)
{
mouldID[2*l] = char(lowByte(ReceivedData[l+4]));
mouldID[2*l+1] = char(highByte(ReceivedData[l+4]));
}
state = ReceivedData[9];
cycltime = float(ReceivedData[10])/10;
robottime =float(ReceivedData[11])/10;
StaticJsonBuffer<200> jsonBuffer;
JsonObject& root = jsonBuffer.createObject();//创建顶节点
root["d0"] = robbotID;
root["d1"] = machineID;
root["d2"] = mouldID;
root["d3"] = state;
root["d4"] = cycltime;
root["d5"] = robottime;
root.printTo(Serial);
Serial.println();
root.printTo(publishmsg);
client.publish(topic_name,publishmsg);
}
}
//初始化wifi
void setup_wifi(){
delay(10);
WiFi.begin(ssid,password);
while(WiFi.status() != WL_CONNECTED){
delay(500);
Serial.print("...");
}
}
//连接服务器
void reconnect(){
while(!client.connected()){//如果没有连上
if (client.connect(client_id)){//接入时本设备id
Serial.println("connect success");
}else{
Serial.print("failed,rc=");
Serial.print(client.state());
Serial.print("try 5 seconds later");
delay(5000);
}
}
}
void setup(){
Serial.begin(9600);
setup_wifi();
node.begin(1,Serial);
client.setServer(mqtt_server,port);
lastSend = 0;
}
void loop(){
reconnect();
if (millis() - lastSend > 10000){
GetModbusData();
lastSend = millis();
}
client.loop();
}
用python写了一个简单的mqtt客户端做测试,代码如下
# -*- coding: utf-8 -*-
"""
Created on Sat Jan 26 16:15:27 2019
@author: 46980
"""
import paho.mqtt.client as mqtt
HOST = "192.168.10.82"
PORT = 1883
# 连接MQTT服务器
def on_connect(client,userdata,flags,rc):
print("connect with result code"+str(rc))
client.subscribe("/public/TEST/")
# 消息处理函数
def on_message(client, userdata, msg):
print("hello")
print(msg.topic+" "+str(msg.payload))
client = mqtt.Client("test001")
client.on_connect = on_connect
client.on_message = on_message
client.connect("192.168.10.82",1883,60,)
client.loop_forever()
测试成功后会有如下显示
pahomqtt库说明 说明: “connect with code 0: Connection successful 1: Connection refused - incorrect protocol version 2: Connection refused - invalid client identifier 3: Connection refused - server unavailable 4: Connection refused - bad username or password 5: Connection refused - not authorised 6-255: Currently unused.“