📄 comm.c
字号:
// result_485[tmr] += tmp_char;
// //
// break;
// case FUN_02_YUHE:
// tmp_char = ST_INVALID;
// result_485[tmr] = result_485[tmr] << 1; //
// if (!YUHE)
// {
// tmp_char = SW_VALID;
// }
// result_485[tmr] += tmp_char;
// //
// break;
// case FUN_02_UP_GLD_HE:
// tmp_char = ST_INVALID;
// result_485[tmr] = result_485[tmr] << 1;
// result_485[tmr] += tmp_char;
// break;
// case FUN_02_DOWN_GLD_HE:
// tmp_char = ST_INVALID;
// result_485[tmr] = result_485[tmr] << 1;
// result_485[tmr] += tmp_char;
// break;
// case FUN_02_BLQSC_WORK:
// tmp_char = ST_INVALID;
// result_485[tmr] = result_485[tmr] << 1;
// result_485[tmr] += tmp_char;
// break;
// case FUN_02_BLQSC_TEST:
// tmp_char = ST_INVALID;
// result_485[tmr] = result_485[tmr] << 1;
// result_485[tmr] += tmp_char;
// break;
// case FUN_02_PTSC_WORK:
// tmp_char = ST_INVALID;
// result_485[tmr] = result_485[tmr] << 1;
// result_485[tmr] += tmp_char;
// break;
// case FUN_02_PTSC_TEST:
// tmp_char = ST_INVALID;
// result_485[tmr] = result_485[tmr] << 1;
// result_485[tmr] += tmp_char;
// break;
// case FUN_02_GLKG_HE:
// tmp_char = ST_INVALID;
// result_485[tmr] = result_485[tmr] << 1;
// result_485[tmr] += tmp_char;
// break;
// case FUN_02_BFQSC_WORK:
// tmp_char = ST_INVALID;
// result_485[tmr] = result_485[tmr] << 1;
// result_485[tmr] += tmp_char;
// break;
// case FUN_02_BFQSC_TEST:
// tmp_char = ST_INVALID;
// result_485[tmr] = result_485[tmr] << 1;
// result_485[tmr] += tmp_char;
// break;
// case FUN_02_JCQ_HE:
// tmp_char = ST_INVALID;
// result_485[tmr] = result_485[tmr] << 1;
// result_485[tmr] += tmp_char;
// break;
// case FUN_02_JCQ_FEN:
// tmp_char = ST_INVALID;
// result_485[tmr] = result_485[tmr] << 1;
// result_485[tmr] += tmp_char;
// break;
// case FUN_02_PLGLKG_HE:
// tmp_char = ST_INVALID;
// result_485[tmr] = result_485[tmr] << 1;
// result_485[tmr] += tmp_char;
// break;
// case FUN_02_GZDGLKG_HE:
// tmp_char = ST_INVALID;
// result_485[tmr] = result_485[tmr] << 1;
// result_485[tmr] += tmp_char;
// break;
// case FUN_02_BYDGLKG_HE:
// tmp_char = ST_INVALID;
// result_485[tmr] = result_485[tmr] << 1;
// result_485[tmr] += tmp_char;
// break;
// case FUN_02_GZDSC_WORK_WZ:
// tmp_char = ST_INVALID;
// result_485[tmr] = result_485[tmr] << 1;
// result_485[tmr] += tmp_char;
// break;
// case FUN_02_GZDSC_TEST_WZ:
// tmp_char = ST_INVALID;
// result_485[tmr] = result_485[tmr] << 1;
// result_485[tmr] += tmp_char;
// break;
// case FUN_02_BYDSC_WORK_WZ:
// tmp_char = ST_INVALID;
// result_485[tmr] = result_485[tmr] << 1;
// result_485[tmr] += tmp_char;
// break;
// case FUN_02_BYDSC_TEST_WZ:
// tmp_char = ST_INVALID;
// result_485[tmr] = result_485[tmr] << 1;
// result_485[tmr] += tmp_char;
// break;
// default:
// break;
// }
// }
// for (i = 0; i <= tmr; i++)
// {
// rs485_tx1_buf[i + 3] = result_485[tmr - i]; //
// }
// count_485 = 3+tmr + 1; //
// break; //
//=============================FUN_03==============================
case FUN_03:
b_len = rs485_rx1_buf[L_NUM_H] *256+rs485_rx1_buf[L_NUM_L];
//
if ((b_len > FUN_03_NUM) || ((p_addr + b_len) > FUN_03_NUM))
{
//长度不符合规范
rs485_tx1_buf[0] = rs485_rx1_buf[0]; //ADDR
rs485_tx1_buf[1] = rs485_rx1_buf[1] | 0x80; //FUN
rs485_tx1_buf[2] = MODBUS_ERR_NOSUP;
count_485 = 3;
break;
}
rs485_tx1_buf[0] = rs485_rx1_buf[0]; //
rs485_tx1_buf[1] = FUN_03; //
rs485_tx1_buf[2] = b_len * 2;
for (i = p_addr, j = 3; i < b_len + p_addr; i++)
{
switch (i)
{
case FUN_03_WA:
// tmp_int = (uint)(temp_a *WS_QUOTIETY);
rs485_tx1_buf[j++] = 0;
rs485_tx1_buf[j++] = 0;
break;
case FUN_03_SA:
// tmp_int = (uint)(hum_a *WS_QUOTIETY);
rs485_tx1_buf[j++] = 0;
rs485_tx1_buf[j++] = 0;
break;
case FUN_03_WB:
// tmp_int = (uint)(temp_b *WS_QUOTIETY);
rs485_tx1_buf[j++] = 0;
rs485_tx1_buf[j++] = 0;
break;
case FUN_03_SB:
// tmp_int = (uint)(hum_b *WS_QUOTIETY);
rs485_tx1_buf[j++] = 0;
rs485_tx1_buf[j++] = 0;
break;
case FUN_03_HA:
tmp_int = (uint)(ifr_To[0] *WS_QUOTIETY);
rs485_tx1_buf[j++] = tmp_int / 256;
rs485_tx1_buf[j++] = tmp_int % 256;
break;
case FUN_03_HB:
tmp_int = (uint)(ifr_To[1] *WS_QUOTIETY);
rs485_tx1_buf[j++] = tmp_int / 256;
rs485_tx1_buf[j++] = tmp_int % 256;
break;
case FUN_03_HC:
tmp_int = (uint)(ifr_To[2] *WS_QUOTIETY);
rs485_tx1_buf[j++] = tmp_int / 256;
rs485_tx1_buf[j++] = tmp_int % 256;
break;
case FUN_03_HD:
tmp_int = (uint)(ifr_To[3] *WS_QUOTIETY);
rs485_tx1_buf[j++] = tmp_int / 256;
rs485_tx1_buf[j++] = tmp_int % 256;
break;
case FUN_03_HE:
tmp_int = (uint)(ifr_To[4] *WS_QUOTIETY);
rs485_tx1_buf[j++] = tmp_int / 256;
rs485_tx1_buf[j++] = tmp_int % 256;
break;
case FUN_03_HF:
tmp_int = (uint)(ifr_To[5] *WS_QUOTIETY);
rs485_tx1_buf[j++] = tmp_int / 256;
rs485_tx1_buf[j++] = tmp_int % 256;
break;
case FUN_03_HG:
tmp_int = (uint)(ifr_To[6] *WS_QUOTIETY);
rs485_tx1_buf[j++] = tmp_int / 256;
rs485_tx1_buf[j++] = tmp_int % 256;
break;
case FUN_03_HH:
tmp_int = (uint)(ifr_To[7] *WS_QUOTIETY);
rs485_tx1_buf[j++] = tmp_int / 256;
rs485_tx1_buf[j++] = tmp_int % 256;
break;
case FUN_03_HI:
tmp_int = (uint)(ifr_To[8] *WS_QUOTIETY);
rs485_tx1_buf[j++] = tmp_int / 256;
rs485_tx1_buf[j++] = tmp_int % 256;
break;
case FUN_16_JIARE:
// tmp_int = (uchar)rdata[0];
tmp_int *= WS_QUOTIETY;
rs485_tx1_buf[j++] = tmp_int / 256;
rs485_tx1_buf[j++] = tmp_int % 256;
break;
case FUN_16_FENGJI:
// tmp_int = (uchar)rdata[1];
tmp_int *= WS_QUOTIETY;
rs485_tx1_buf[j++] = tmp_int / 256;
rs485_tx1_buf[j++] = tmp_int % 256;
break;
case FUN_16_CHUSHI:
// tmp_int = (uchar)rdata[3];
tmp_int *= WS_QUOTIETY;
rs485_tx1_buf[j++] = tmp_int / 256;
rs485_tx1_buf[j++] = tmp_int % 256;
break;
case FUN_16_HONGWAI:
tmp_int = eepara.Ifr_Warning_Ceiling;
tmp_int *= WS_QUOTIETY;
rs485_tx1_buf[j++] = tmp_int / 256;
rs485_tx1_buf[j++] = tmp_int % 256;
break;
case FUN_16_ADDRESS:
tmp_int = eepara.address;
rs485_tx1_buf[j++] = tmp_int / 256;
rs485_tx1_buf[j++] = tmp_int % 256;
break;
case FUN_16_SPEED:
switch (eepara.speed)
{
case 12:
tmp_int = 0x04b0;
break;
case 24:
tmp_int = 0x0960;
break;
case 48:
tmp_int = 0x12c0;
break;
case 96:
tmp_int = 0x2580;
break;
default:
tmp_int = 0x0960;
break;
}
rs485_tx1_buf[j++] = tmp_int / 256;
rs485_tx1_buf[j++] = tmp_int % 256;
break;
default:
break;
}
}
count_485 = j;
break;
//=====================FUN_16====================================
case FUN_16:
tmp_exit = 0;
b_len = rs485_rx1_buf[L_NUM_H] *256+rs485_rx1_buf[L_NUM_L];
//
if ((b_len > FUN_16_NUM) || ((p_addr + b_len) > FUN_16_NUM))
{
//长度不符合规范
rs485_tx1_buf[0] = rs485_rx1_buf[0]; //ADDR
rs485_tx1_buf[1] = rs485_rx1_buf[1] | 0x80; //FUN
rs485_tx1_buf[2] = MODBUS_ERR_NOSUP;
count_485 = 3;
tmp_exit = 1;
break;
}
for (i = 0; i < b_len; i++)
{
switch (i + p_addr)
{
//设定红外报警温度
case FUN_16_HONGWAI:
tmp_int = (rs485_rx1_buf[L_DATA + i * 2] *256
+rs485_rx1_buf[L_DATA + i * 2+1]) /
WS_QUOTIETY;
if (tmp_int > 99)
{
rs485_tx1_buf[0] = rs485_rx1_buf[0]; //ADDR
rs485_tx1_buf[1] = rs485_rx1_buf[1] | 0x80;
//FUN
rs485_tx1_buf[2] = MODBUS_ERR_NOSUP;
count_485 = 3;
tmp_exit = 1;
break;
}
if (eepara.Ifr_Warning_Ceiling != (tmp_int &0xff))
{
eepara.Ifr_Warning_Ceiling = (tmp_int &0xff);
Eeprom_Write();
}
break;
//设定通讯数率
case FUN_16_SPEED:
tmp_int = (rs485_rx1_buf[L_DATA + i * 2] *256
+rs485_rx1_buf[L_DATA + i * 2+1]);
tmp_speed = 0;
switch (tmp_int)
{
case 1200:
tmp_speed = 143;
break;
case 2400:
tmp_speed = 71;
break;
case 4800:
tmp_speed = 35;
break;
case 9600:
tmp_speed = 17;
break;
default:
//速度不符合规范
rs485_tx1_buf[0] = rs485_rx1_buf[0]; //ADDR
rs485_tx1_buf[1] = rs485_rx1_buf[1] | 0x80;
//FUN
rs485_tx1_buf[2] = MODBUS_ERR_NOSUP;
count_485 = 3;
tmp_exit = 1;
break;
}
if ((tmp_speed) && (tmp_speed != eepara.speed))
{
eepara.speed = (tmp_int &0xff);
Eeprom_Write();
}
break;
//设定通讯地址
case FUN_16_ADDRESS:
tmp_int = (rs485_rx1_buf[L_DATA + i * 2] *256
+rs485_rx1_buf[L_DATA + i * 2+1]);
if ((tmp_int == 0) || (tmp_int > 0xf7))
{
rs485_tx1_buf[0] = rs485_rx1_buf[0]; //ADDR
rs485_tx1_buf[1] = rs485_rx1_buf[1] | 0x80;
//FUN
rs485_tx1_buf[2] = MODBUS_ERR_NOSUP;
count_485 = 3;
tmp_exit = 1;
}
else
{
if (eepara.address != (tmp_int &0xff))
{
eepara.address = (tmp_int &0xff);
Eeprom_Write();
}
}
break;
default:
break;
}
if (tmp_exit)
{
break;
}
}
if (!tmp_exit)
{
for (i = 0; i < 6; i++)
{
rs485_tx1_buf[i] = rs485_rx1_buf[i];
}
count_485 = 6;
}
break;
default:
break;
}
//发送数据帧
if (count_485 > 0)
{
//result_485 = 0;
crc_l = CRC16(rs485_tx1_buf, count_485);
crc_h = CRC16_1(rs485_tx1_buf, count_485);
rs485_tx1_buf[count_485++] = crc_h;
rs485_tx1_buf[count_485++] = crc_l;
ex_modbus_r_count = 0;
modbus_proc_flag = 0;
MODBUS_RS485_EN = RS_485_SND;
for (i = 0; i <= count_485; i++)
{
while (TXSTA2bits.TRMT == 0){}
TXREG2 = rs485_tx1_buf[i];
TXD1 = ~TXD1;
}
for (i = 0; i < 400; i++) ;//wait50ms
MODBUS_RS485_EN = RS_485_RCV;
modbus_r_over = 0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -