#include
//////////// Modbus TCP / IP // quierido para Modbus TCP/IP ////////
#define maxInputRegister 20
#define maxHoldingRegister 20
#define MB_FC_none 0
#define MB_FC_READ_registers 3 //实现
#define MB_FC_WRITE_register 6 //实现
#define MB_FC_WRITE_MULTIPLE_REGISTERS" 16 //实现
//
// MODBUS 错误代码
//
#define MB_EC_NONE 0
#define MB_EC_ILLEGAL_FUNCTION 1
#define MB_EC_ILLEGAL_DATA_ADDRESS 2.
#define MB_EC_ILLEGAL_DATA_VALUE 3.
#define MB_EC_SLAVE_DEVICE_FAILURE 4.
//
// MODBUS MBAP 偏移
//
#define MB_tcp_TID 0
#define MB_tcp_PID 2.
#define MB_tcp_LEN 4.
#define MB_tcp_UID 6.
#define MB_tcp_FUNC 7.
#define MB_tcp_register_start 8.
#define MB_tcp_register_number 10.
字节 MAC[]={0xDE、0xAD、0xBE、0xEF、0xFE、 0xED };
IP 地址(192、168、1、177);
IP 地址网关(192、168、1、1);
ipaddress 子网(255、255、255、0);
int Modbustcp_port = 502;
字节字节字节字节阵列[260];
unsigned int MBHoldingRegister[maxHoldingRegister];
EthernetClient 客户端;
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
EthernetServer MBServer (Modbustcp_port);
void setup(){
引脚模式(Pn_0、输出);
Serial.begin(9600);
延迟(100);
ethernet/enableLinkLed();
ethernet/enableActivityLed();
Ethernet.begin(mac、IP、网关、子网);
延迟(100);
serial.println(".");
MBServer.begin();
serial.println ("已连接");
serial.print ("ESP8266从属 Modbus TCP/IP ");
ip.printto (串行);
serial.print (":");
serial.println (字符串(Modbustcp_port));
serial.println ("Modbus TCP/IP Online");
}
void loop(){
//检查客户端是否已连接// Modbus TCP/IP
EthernetClient 客户端= MBServer.available ();
如果(!client){
返回;
}
布尔标志 ClientConnected = 0;
字节字节字节字节字节 byteFN = MB_FC_none;
Int Start;
整型 WordDataLength;
int ByteDataLength;
Int MessageLength;
// Modbus TCP/IP
while (client.connected()){
if (client.available ())
{
flagClientConnected = 1;
int i = 0;
while (client.available ())
{
ByteArray[i]= client.read();
i++;
}
client.flush();
////// 代码-- Codigo aqui
//////////////// 保持寄存器[0] A [9]= 10保持寄存器 Escritura
//////////////// 保持寄存器[0] A [9]= 10保持寄存器写入
int sensorValue1 = analogRead (24);
MBHoldingRegister[0]= sensorValue1;
MBHoldingRegister[1]= 10;
MBHoldingRegister[2]= 13;
//////////////// 保持寄存器[10] A [19]=10保持寄存器 Lectura
////// 保持寄存器[10] A [19]= 10保持寄存器读数
unsigned int Temporal[10];
时间[0]= MBHoldingRegister[10];
时间[1]= MBHoldingRegister[11];
时间[2]= MBHoldingRegister[12];
时间[3]= MBHoldingRegister[13];
时间[4]= MBHoldingRegister[14];
时间[5]= MBHoldingRegister[15];
Tempory[6]= MBHoldingRegister[16];
时间[7]= MBHoldingRegister[17];
时间[8]= MBHoldingRegister[18];
时间[9]= MBHoldingRegister[19];
///启用输出14
digitalWrite (PN_0、MBHoldingRegister[14]);
////调试
对于(int i = 0;i < 10;i++){
serial.print("[");
serial.print(i);
serial.print ("]);
serial.print (Temporal[i]);
}
serial.println("");
////结束代码- fin
//// rutine Modbus TCP
byteFN = ByteArray[MB_tcp_FUNC];
START =字(ByteArray[MB_tcp_register_start]、ByteArray[MB_tcp_register_start+1]);
WordDataLength =字(ByteArray[MB_tcp_register_number]、ByteArray[MB_tcp_register_number+1]);
}
//处理请求
switch (byteFN){
案例 MB_FC_none:
中断;
案例 MB_FC_Read_Registers:// 03读取保持寄存器
ByteDataLength = WordDataLength * 2;
ByteArray[5]= ByteDataLength + 3;//此字段之后的字节数。
ByteArray[8]= ByteDataLength;//这一个之后的字节数(或数据的字节数)。
for (int i = 0;i < WordDataLength;i++)
{
ByteArray[9 + I * 2]=高字节(MBHoldingRegister[Start + I]);
ByteArray[10 + I * 2]=低字节(MBHoldingRegister[Start + I]);
}
MessageLength = ByteDataLength + 9;
client.write (((const uint8_t *) ByteArray、MessageLength);
字节 FN = MB_FC_none;
中断;
案例 MB_FC_WRITE_register:// 06写入保持寄存器
MBHoldingRegister[Start]=字(ByteArray[MB_tcp_register_number]、ByteArray[MB_tcp_register_number+1]);
ByteArray[5]= 6;//此字段后面的字节数。
MessageLength = 12;
client.write (((const uint8_t *) ByteArray、MessageLength);
字节 FN = MB_FC_none;
中断;
案例 MB_FC_WRITE_MULTIPLE_REGISTERS"://16写入保持寄存器
ByteDataLength = WordDataLength * 2;
ByteArray[5]= ByteDataLength + 3;//此字段之后的字节数。
for (int i = 0;i < WordDataLength;i++)
{
MBHoldingRegister[Start + I]= word (ByteArray[ 13 + I * 2]、ByteArray[14 + I * 2]);
}
MessageLength = 12;
client.write (((const uint8_t *) ByteArray、MessageLength);
字节 FN = MB_FC_none;
中断;
}
}
}