⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 comm.c

📁 pic18f87j10通讯MODBUS-RT应用程序
💻 C
📖 第 1 页 / 共 3 页
字号:
//                            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 + -