TA的每日心情 | 开心 2024-4-7 13:52 |
---|
签到天数: 326 天 连续签到: 1 天 [LV.8]以坛为家I
|
看了两个礼拜的国标,前两天在32 上面实现了,今天移植到RT1052上来,费了不少时间,也算给自己一个交代了哈哈哈,先上图!!证明Modbus-RTU 是调试通过了的。
还是按照原来的风格来文末附代码!
首先在Modbus-RTU 的国标中抠出CRC校验的函数,分别分为.c和.h两个文件这里 就直接附代码了,
《这里是直接使用FreeModbus 协议栈里面的代码---》
- /*
- * FreeModbus Libary: A portable Modbus implementation for Modbus ASCII/RTU.
- * Copyright (c) 2006 Christian Walter <wolti@sil.at>
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * File: $Id: mbcrc.c,v 1.7 2007/02/18 23:50:27 wolti Exp $
- */
-
- #include "mbcrc.h"
- static const unsigned char aucCRCHi[] = {
- 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
- 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
- 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
- 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
- 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
- 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
- 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
- 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
- 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
- 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
- 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
- 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
- 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
- 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
- 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
- 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
- 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
- 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
- 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
- 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
- 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
- 0x00, 0xC1, 0x81, 0x40
- };
- static const unsigned char aucCRCLo[] = {
- 0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06, 0x07, 0xC7,
- 0x05, 0xC5, 0xC4, 0x04, 0xCC, 0x0C, 0x0D, 0xCD, 0x0F, 0xCF, 0xCE, 0x0E,
- 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09, 0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9,
- 0x1B, 0xDB, 0xDA, 0x1A, 0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC,
- 0x14, 0xD4, 0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3,
- 0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3, 0xF2, 0x32,
- 0x36, 0xF6, 0xF7, 0x37, 0xF5, 0x35, 0x34, 0xF4, 0x3C, 0xFC, 0xFD, 0x3D,
- 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A, 0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38,
- 0x28, 0xE8, 0xE9, 0x29, 0xEB, 0x2B, 0x2A, 0xEA, 0xEE, 0x2E, 0x2F, 0xEF,
- 0x2D, 0xED, 0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26,
- 0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60, 0x61, 0xA1,
- 0x63, 0xA3, 0xA2, 0x62, 0x66, 0xA6, 0xA7, 0x67, 0xA5, 0x65, 0x64, 0xA4,
- 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F, 0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB,
- 0x69, 0xA9, 0xA8, 0x68, 0x78, 0xB8, 0xB9, 0x79, 0xBB, 0x7B, 0x7A, 0xBA,
- 0xBE, 0x7E, 0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5,
- 0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71, 0x70, 0xB0,
- 0x50, 0x90, 0x91, 0x51, 0x93, 0x53, 0x52, 0x92, 0x96, 0x56, 0x57, 0x97,
- 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C, 0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E,
- 0x5A, 0x9A, 0x9B, 0x5B, 0x99, 0x59, 0x58, 0x98, 0x88, 0x48, 0x49, 0x89,
- 0x4B, 0x8B, 0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C,
- 0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42, 0x43, 0x83,
- 0x41, 0x81, 0x80, 0x40
- };
- /*-----------------------*/
- unsigned short usMBCRC16( unsigned char * pucFrame, unsigned short usLen )
- {
- unsigned char ucCRCHi = 0xFF;
- unsigned char ucCRCLo = 0xFF;
- int iIndex;
- while( usLen-- )
- {
- iIndex = ucCRCLo ^ *( pucFrame++ );
- ucCRCLo = ( unsigned char )( ucCRCHi ^ aucCRCHi[iIndex] );
- ucCRCHi = aucCRCLo[iIndex];
- }
- return ( unsigned short )( ucCRCHi << 8 | ucCRCLo );
- }
- /*--------------------------------- end of the files -- 小申 ---------------------*/
复制代码
头文件里面包含的也比较少,只有那个
- /*
- * FreeModbus Libary: A portable Modbus implementation for Modbus ASCII/RTU.
- * Copyright (c) 2006 Christian Walter <wolti@sil.at>
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * File: $Id: mbcrc.h,v 1.5 2006/12/07 22:10:34 wolti Exp $
- */
- #ifndef _MB_CRC_H
- #define _MB_CRC_H
- unsigned short usMBCRC16( unsigned char * pucFrame, unsigned short usLen );
- #endif
复制代码
Modbus-RTU 的结束标志是3.5T的时间内没有接收到数据就代表数据接收完成,所以我们这里的定时器设置为1us中断一次,方便Modbus-RTU 计算协议结束的标志,这也是国标上的指导做法。
整个数据的接收在串口中断中进行,第一次接收到中断就打开定时器,第二次接收到数据就将计数器清零-这样才能保证3.5T 的数据时真实有效的,当接收的计时超过3.5T的时候就将接收结束标志位置1 这样处理函数才知道我这一个Modbus帧接收完了,可以进行处理了
下面贴上定时器的处理代码----
- #include "TIM.h"
- #include "Modbus.h"
- int count=0;
- //--定义1us 中断一次----
- void TIM_X_Init(void)
- {
- gpt_config_t gpt1_onfig;
- GPT_GetDefaultConfig(&gpt1_onfig); //先初始化GPT1为默认值
- gpt1_onfig.clockSource= kGPT_ClockSource_Periph; //初始化时钟源perclk_clk_root
- gpt1_onfig.divider=75-1; //设置分频值--取值范围:1-4096
- GPT_Init(GPT1,&gpt1_onfig);
- //
- GPT_SetOutputCompareValue(GPT1,kGPT_OutputCompare_Channel1,1); //设置比较计数值
- GPT_EnableInterrupts(GPT1,kGPT_OutputCompare1InterruptEnable); //使能GPT比较通道1中断
- NVIC_SetPriority(GPT1_IRQn,1);
- EnableIRQ(GPT1_IRQn); //使能GPT1中断
- GPT_StopTimer(GPT1); //关闭定时器---
- }
- //GPT1中断服务函数
- void GPT1_IRQHandler(void)
- {
- //OCR1中断
- if(GPT_GetStatusFlags(GPT1,kGPT_OutputCompare1Flag))
- {
- GPT_ClearStatusFlags(GPT1,kGPT_OutputCompare1Flag);//清除中断标志位
- MB_Uart4.T35_Count++;
- if(MB_Uart4.T35_Count>MB_Uart4.T35)//--3.5T 时间到了 ----
- {
- // 发送结束标志位--
- MB_Uart4.T35_Count=0;//--clear the count data
- MB_Uart4.RxEndFlag=1;//--接收标志位设置为1 -表示接收数据完成
- //--添加关闭时钟--
- GPT_StopTimer(GPT1);
- }
- }
- }
复制代码 在整个处理过程中,均按照Modbus国标做指导完成,下面就是今天最核心的东西,Modbus-RTU 处理函数,在代码中做了详细的介绍,所以这里就不多做介绍了,将来肯定用得到的,哈哈哈。
- #include "SystemIncludes.h"
- #include "Modbus.h"
- ModbusDatastruct MB_Uart4;
- unsigned short REG_Data[50]={0xaa55,0xaa55,0xaa55,0xaa55,0xaa55,0xaa55,0xaa55,0xaa55,0xaa55,0xaa55,
- 0xaa55,0xaa55,0xaa55,0xaa55,0xaa55,0xaa55,0xaa55,0xaa55,0xaa55,0xaa55,
- 0xaa55,0xaa55,0xaa55,0xaa55,0xaa55,0xaa55,0xaa55,0xaa55,0xaa55,0xaa55,
- 0xaa55,0xaa55,0xaa55,0xaa55,0xaa55,0xaa55,0xaa55,0xaa55,0xaa55,0xaa55,
- 0xaa55,0xaa55,0xaa55,0xaa55,0xaa55,0xaa55,0xaa55,0xaa55,0xaa55,0xaa55};
- void MB_InitData(unsigned char Station_ADDR)
- {
- int i=0;
-
- MB_Uart4.MB_Addr=Station_ADDR;//--站号
- MB_Uart4.DataSourse=4;//--信号源为串口四
- MB_Uart4.MB_RxData_Len=0;
- MB_Uart4.MB_TxData_Len=0;
- MB_Uart4.RxDataFlag=0;
- MB_Uart4.RxEndFlag=0;
- MB_Uart4.RxStartFlag=0;
- MB_Uart4.SendFlag=0;
- MB_Uart4.T35=90;
- MB_Uart4.T35_Count=0;
- for(i=0;i<256;i++)
- {
- MB_Uart4.MB_RxData[i]=0;
- MB_Uart4.MB_TxData[i]=0;
- }
- }
- unsigned short ReadMultReg_03(unsigned char *Buffer,unsigned short StartAddr,unsigned short Length)//--读取函数 :数据存储介质-- 起始地址 ------ 以及数量--
- {
- unsigned char i=0,j=0;
- CopyBoard CopyData; //中间变量存储--
- unsigned char *DataAddr; //**
- CopyData.DataByteNum=Length*2;//--读取字节变量的数量--由于读取寄存器是16位的,而这里是按照字节处理的-所以要*2
- CopyData.ReturnDataLength=Length*2;//--返回数据的长度----
- CopyData.StartBytePosition=StartAddr;//--起始地址--
- // DataAddr=(unsigned char *)&AI_AO_Data[CopyData.StartBytePosition];
- //--开始拷贝数据----
- for (i=0;i<Length;i++)
- {//--
- Buffer[2*i]=((REG_Data[i+StartAddr]>>8)&0xff);//--复制数据--
- Buffer[2*i+1]=(REG_Data[i+StartAddr]&0xff);
- }
- return CopyData.ReturnDataLength;//--返回拷贝的字节数量----
- }
- void ModbusProscess(ModbusDatastruct *MB)
- {
- unsigned short CRC_Data=0;
- unsigned int i=0;
- unsigned short RTN_DataLen=0;//--函数返回的获取到的字符的长度----
- unsigned int DataLimit=0;
- MB->SendFlag=0;
- // MB.ProtocalStr.CRCData=MB.MB_RxData[MB_CRC_H]<<8|MB.MB_RxData[MB_CRC_L];
- // //--开始计算CRC--
- // //--在这里进行数据处理----
- MB->ProtocalStr.Addr=MB->MB_RxData[MB_Addr];
- MB->ProtocalStr.FunCode=MB->MB_RxData[MB_FunCode];
- MB->ProtocalStr.MB_StartAddr=MB->MB_RxData[MB_StartAddr]<<8|MB->MB_RxData[MB_StartAddr+1];
- // MB->ProtocalStr.MB_DataNum=MB->MB_RxData[MB_DataNum]<<8|MB->MB_RxData[MB_DataNum+1];
- MB->ProtocalStr.CRCData=MB->MB_RxData[MB->MB_RxData_Len-1]<<8|MB->MB_RxData[MB->MB_RxData_Len-2];//--填入CRC数值--
- CRC_Data=usMBCRC16(MB->MB_RxData,MB->MB_RxData_Len-2);//--从站只是接受命令,所以长度固定----
- if(CRC_Data==MB->ProtocalStr.CRCData)//--如果CRC 校验过了 就可以继续下面的数据处理了----
- {
- //-- 首先将数据整理到结构体中--此处应当还需要判断是读还是写--
- if(MB->ProtocalStr.Addr==MB->MB_Addr)//--判断Modbus地址是否为本机地址----
- {
- //--是否是支持的功能码----
- if((MB->ProtocalStr.FunCode<5)&&(MB->ProtocalStr.FunCode>2))//--判断功能码是否有效----
- {
- switch (MB->ProtocalStr.FunCode)
- {
-
- case ReadMultRegister : //--功能码:03 -- 读多个寄存器----
- {
- MB->ProtocalStr.MB_DataNum=MB->MB_RxData[MB_DataNum]<<8|MB->MB_RxData[MB_DataNum+1];
- MB->ProtocalStr.CRCData=MB->MB_RxData[MB->MB_RxData_Len-1]<<8|MB->MB_RxData[MB->MB_RxData_Len-2];//--填入CRC数值--
-
- //--进入这里,说明地址和功能码都满足了,现在需要做的事判断输出数量是否在规定范围内--
- //--IO数量的计算应当从起始地址+数量来计算--如果起始地址加上数量之后大于IO的点数,
- //--此时应当报错处理--
- DataLimit=MB->ProtocalStr.MB_StartAddr + MB->ProtocalStr.MB_DataNum;//--起始地址+读取数量---
- if((DataLimit>=1)&&(DataLimit<MaxiunReadREG_Data))
- {
-
- MB->MB_TxData[TX_MB_Addr]=MB->MB_RxData[MB_Addr];//--填充站号---
- MB->MB_TxData[TX_MB_FunCode]=MB->MB_RxData[MB_FunCode];//--填充功能码--
- //--读取线圈的函数----unsigned short ReadMultReg_03(u8 *Buffer,unsigned short StartAddr,unsigned short Length)
- RTN_DataLen=ReadMultReg_03(&MB->MB_TxData[TX_MB_DataBase],MB->ProtocalStr.MB_StartAddr,MB->ProtocalStr.MB_DataNum);
- //--填充字节数--
- MB->MB_TxData[TX_MB_TxNum]=(unsigned char )(RTN_DataLen&0xff); //--填充字节数--
- //--开始填充数据--
- //计算CRC---校验和----校验是按照从包头开始 -- 一直到数据结束---
- CRC_Data=usMBCRC16( MB->MB_TxData, RTN_DataLen+3 );//--计算CRC的数值
-
- RTN_DataLen=RTN_DataLen+5; //--这里是包含了CRC校验的----站号 +功能码 +数量+CRCData*2=5
- MB->MB_TxData_Len=RTN_DataLen;//--传入带发送的字节长度--
- MB->MB_TxData[RTN_DataLen-2]=(CRC_Data&0xff); //--CRC-H
- MB->MB_TxData[RTN_DataLen-1]=((CRC_Data>>8)&0xff); //--CRC-L
- // 完成数据包的组包
- //-- 发送标志----
- MB->SendFlag=1;
- }
- else/*--说明--超出范围了---应当返回异常码------ --*/
- {
- MB->MB_TxData[MB_Addr]=(0x80+ MB->MB_RxData[MB_FunCode]);//--填充站号--
- MB->MB_TxData[MB_FunCode]=MB_ERR_Output_Outof_RangeNum;//--填充功能码--错误码--
- MB->MB_TxData_Len=2;
- MB->SendFlag=1;
- }
- }
- break ;
- //--
- case ReadinputRegister : //--功能码:04 -- 读输入寄存器----
- {
-
- }
- break ;
- }
- //--清除标接收缓冲区的数据
- MB->MB_RxData_Len=0;
- MB->RxStartFlag=0;
- MB->RxEndFlag=0;
- for(i=0;i<256;i++)
- {
- MB->MB_RxData[i]=0;
- }
- }
- else //--说明功能码不在可用的范围内--应当返回的 0x80 + 功能码 为地址的数据---
- {
-
- for(i=0;i<256;i++)
- {
- MB->MB_TxData[i]=0;
- MB->MB_RxData[i]=0;
- }
- MB->RxEndFlag=0;
- MB->RxStartFlag=0;
- MB->MB_TxData[MB_Addr]=(0x80+ MB->MB_RxData[MB_FunCode]);//--填充站号--
- MB->MB_TxData[MB_FunCode]=MB_ERR_UnsupportedFuncode;//--填充功能码--
- }
- //--此处添加发送函数
- switch(MB->DataSourse)
- {
- case 1 :
- {
- }break;
- case 2 :
- {
- }break;
- case 3 :
- {
- }break;
-
- case 4 :/*--串口4--*/
- {
- if(MB->SendFlag==1)
- {
- MB->SendFlag=0;//--清除发送标志位
- MB->RxStartFlag=0;
- for(i=0;i<MB->MB_TxData_Len;i++)
- {
- UART_SendChar(LPUART4,MB->MB_TxData[i]);
- }
- //--发送完成之后-清除数据区
- //--清除标志位--
- for(i=0;i<256;i++)
- {
- MB->MB_TxData[i]=0;
- MB->MB_RxData[i]=0;
- }
- }
- }break;
- }
- }
- else/*--站号不是本机的站号---*/
- {
-
- }
- }
- for(i=0;i<256;i++)
- {
- MB->MB_TxData[i]=0;
- MB->MB_RxData[i]=0;
- }
- MB->RxEndFlag=0;
- MB->RxStartFlag=0;
- }
复制代码
好啦!今天的分享就到这里,对大家肯定有帮助!!!!!!!!!!!!
//============================================================
Modbus-RTU:
RT1052-Demo-Modbus.rar
(922.74 KB, 下载次数: 8, 售价: 5 与非币)
|
|