1. راهاندازی MODBUS SLAVE
1.1 مقداردهی اولیه Slave
//Slave تعریف متغیرهای ModbusSlaveConfig_t modbusSlaveCom1; ModbusSlaveConfig_t modbusSlaveCom2; //COM1 برای Slave مقداردهی اولیه ModbusSlave_Init(&modbusSlaveCom1, 1, 1); // Address: 1, COM Port: 1 ModbusSlave_Enable(&modbusSlaveCom1, true); // COM2 برای Slave مقداردهی اولیه ModbusSlave_Init(&modbusSlaveCom2, 2, 2); // Address: 2, COM Port: 2 ModbusSlave_Enable(&modbusSlaveCom2, true);
1.2 مقداردهی اولیه دادهها
//Modbus مقداردهی اولیه دادههای ModbusData_Init(&modbusData, 32, 32, 20, 20); // Coils, Discrete Inputs, Input Registers, Holding Registers //Holding Registers تنظیم مقادیر اولیه ModbusSlave_SetHoldingRegister(&modbusSlaveCom1, 0, 1000); ModbusSlave_SetHoldingRegister(&modbusSlaveCom1, 1, 2000); ModbusSlave_SetHoldingRegister(&modbusSlaveCom1, 2, 3000); //Input Registers تنظیم مقادیر اولیه ModbusSlave_SetInputRegister(&modbusSlaveCom1, 0, 500); ModbusSlave_SetInputRegister(&modbusSlaveCom1, 1, 1500); //Coils تنظیم مقادیر اولیه ModbusSlave_SetCoil(&modbusSlaveCom1, 0, true); ModbusSlave_SetCoil(&modbusSlaveCom1, 1, false); ModbusSlave_SetCoil(&modbusSlaveCom1, 2, true); //Discrete Inputs تنظیم مقادیر اولیه ModbusSlave_SetDiscreteInput(&modbusSlaveCom1, 0, true); ModbusSlave_SetDiscreteInput(&modbusSlaveCom1, 1, false);
2. مدیریت درخواستهای Slave
2.1 Polling برای درخواستها
//Slave برای درخواستهای Polling
void slavePolling() {
// Polling برای Slave COM1
ModbusSlave_Poll(&modbusSlaveCom1);
// Polling برای Slave COM2
ModbusSlave_Poll(&modbusSlaveCom2);
}
2.2 پردازش درخواستها
// پردازش درخواستهای دریافتی
void processSlaveRequests() {
//COM1 بررسی درخواستهای
if (COM1_Request_In) {
ModbusSlave_OnRequest(&modbusSlaveCom1, rxData, modbus_rx_len);
COM1_Request_In = false;
}
//COM2 بررسی درخواستهای
if (COM2_Request_In) {
ModbusSlave_OnRequest(&modbusSlaveCom2, rxData, modbus_rx_len);
COM2_Request_In = false;
}
}
3. بهروزرسانی دادههای Slave
3.1 بهروزرسانی دادههای Slave
// بر اساس ورودیها Holding Registers بهروزرسانی
void updateHoldingRegisters() {
// بهروزرسانی بر اساس ورودیهای دیجیتال
uint16_t inputValue = 0;
for (int i = 0; i < 8; i++) {
if (I0[i].Value) {
inputValue |= (1 << i);
}
}
ModbusSlave_SetHoldingRegister(&modbusSlaveCom1, 0, inputValue);
// بهروزرسانی بر اساس تایمرها
ModbusSlave_SetHoldingRegister(&modbusSlaveCom1, 1, espGetTimerTicks());
// بهروزرسانی بر اساس خروجیها
uint16_t outputValue = 0;
for (int i = 0; i < 6; i++) {
if (Q0[i].Value) {
outputValue |= (1 << i);
}
}
ModbusSlave_SetHoldingRegister(&modbusSlaveCom1, 2, outputValue);
}
3.2 بهروزرسانی Input Registers
//Input Registers بهروزرسانی
void updateInputRegisters() {
// بهروزرسانی بر اساس وضعیت سیستم
ModbusSlave_SetInputRegister(&modbusSlaveCom1, 0, espGetScanTime());
// بهروزرسانی بر اساس خطاها
uint16_t errorCode = 0;
if (COM1_Error) errorCode |= 0x0001;
if (COM2_Error) errorCode |= 0x0002;
ModbusSlave_SetInputRegister(&modbusSlaveCom1, 1, errorCode);
}
3.3 بهروزرسانی Coils
3.4 بهروزرسانی Discrete Inputs
4. خواندن دادههای نوشته شده توسط Master
4.1 خواندن Holding Registers
//Master نوشته شده توسط Holding Registers خواندن
void readMasterHoldingRegisters() {
uint16_t value1 = ModbusSlave_GetHoldingRegister(&modbusSlaveCom1, 0);
uint16_t value2 = ModbusSlave_GetHoldingRegister(&modbusSlaveCom1, 1);
// پردازش مقادیر دریافتی
if (value1 > 1000) {
SetQ(0, 0); // فعال کردن خروجی
}
if (value2 < 500) {
ResetQ(0, 1); // غیرفعال کردن خروجی
}
}
4.2 خواندن Coils
5 مدیریت خطاها و وضعیتها
5.1 بررسی وضعیت Slave
5.2 پاک کردن دادهها
//Modbus پاک کردن تمام دادههای
void clearAllModbusData() {
ClearAllModbusData();
//Slave پاک کردن دادههای
for (int i = 0; i < 32; i++) {
ModbusSlave_SetCoil(&modbusSlaveCom1, i, false);
ModbusSlave_SetDiscreteInput(&modbusSlaveCom1, i, false);
}
for (int i = 0; i < 20; i++) {
ModbusSlave_SetInputRegister(&modbusSlaveCom1, i, 0);
ModbusSlave_SetHoldingRegister(&modbusSlaveCom1, i, 0);
}
}
