OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 83143|回复: 172

在STM32上移植FreeModbus RTU的一点经验总结

  [复制链接]

6

主题

35

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
421
金钱
421
注册时间
2014-4-1
在线时间
11 小时
发表于 2015-12-20 10:44:24 | 显示全部楼层 |阅读模式
本帖最后由 菜鸟2 于 2020-11-7 15:57 编辑

&nbsp;&nbsp;&nbsp;&nbsp;这几天因为工作需要,移植了modbus RTU到STM32来,之前也听说过modbus,但是没有深入了解过,还以为会像usb 那样复杂的,经过这几天的折腾,发现真的太简单了。为了防止过段时间又忘记了怎么移植,在这里把移植过程记录下来,也为了方便初次接触modbus的人。<br>
<div style="text-align:left;">
        <span style="line-height:1.5;"></span><span style="line-height:1.5;">&nbsp; &nbsp; 废话少说,首先去下载源码,我下载的是</span><span style="line-height:1.5;">freemodbus-v1.5.0</span><span style="line-height:1.5;">,解压后如图所示:<br>

<br>
</span><span style="line-height:1.5;">在demo文件夹中有很多移植好的例子,但是没有STM32的,不要紧,我们参考已有的例子来操作就可以了。在demo文件夹下新建一个文件夹,命名为STM32,将BARE文件夹里的文件全部复制过来。<br>
&nbsp; &nbsp; 然后,我们建立一个STM32的工程,我用的是mdk4.72,关于怎么建立工程我就不啰嗦了,在工程里添加modbus 和 port两个文件夹,并在文件夹里添加需要的文件,这些modbus的是在modbus文件夹下面,port的是在刚才新建的那个stm32文件夹下,port.c是我从别的地方弄过来的,里面就是一个开中断和一个关中断的函数,可以不要,我的工程如图:<br>
&nbsp;

<br>
乍一看,也有十几个文件,其实这些文件内容不多,很好理解,而且需要修改的只有port文件夹下的portserial.c 和 porttimer.c 。这两个文件里面有几个空函数,我们看名字就知道这些函数的作用了。<br>
<span>portserial.c&nbsp;</span>如下:<br>
        <div style="background-color:#E8E8E8;">
[mw_shl_code=c,true]#include "port.h"

/* ----------------------- Modbus includes ----------------------------------*/
#include "mb.h"
#include "mbport.h"

/* ----------------------- static functions ---------------------------------*/
static void prvvUARTTxReadyISR( void );
static void prvvUARTRxISR( void );

/* ----------------------- Start implementation -----------------------------*/
void
vMBPortSerialEnable( BOOL xRxEnable, BOOL xTxEnable )
{
    /* If xRXEnable enable serial receive interrupts. If xTxENable enable
     * transmitter empty interrupts.
     */
}

BOOL
xMBPortSerialInit( UCHAR ucPORT, ULONG ulBaudRate, UCHAR ucDataBits, eMBParity eParity )
{
    return FALSE;
}

BOOL
xMBPortSerialPutByte( CHAR ucByte )
{
    /* Put a byte in the UARTs transmit buffer. This function is called
     * by the protocol stack if pxMBFrameCBTransmitterEmpty( ) has been
     * called. */
    return TRUE;
}

BOOL
xMBPortSerialGetByte( CHAR * pucByte )
{
    /* Return the byte in the UARTs receive buffer. This function is called
     * by the protocol stack after pxMBFrameCBByteReceived( ) has been called.
     */
    return TRUE;
}

/* Create an interrupt handler for the transmit buffer empty interrupt
* (or an equivalent) for your target processor. This function should then
* call pxMBFrameCBTransmitterEmpty( ) which tells the protocol stack that
* a new character can be sent. The protocol stack will then call
* xMBPortSerialPutByte( ) to send the character.
*/
static void prvvUARTTxReadyISR( void )
{
    pxMBFrameCBTransmitterEmpty(  );
}

/* Create an interrupt handler for the receive interrupt for your target
* processor. This function should then call pxMBFrameCBByteReceived( ). The
* protocol stack will then call xMBPortSerialGetByte( ) to retrieve the
* character.
*/
static void prvvUARTRxISR( void )
{
    pxMBFrameCBByteReceived(  );
}[/mw_shl_code]
        </div>
&nbsp; &nbsp; 根据注释,可以知道vMBPortSerialEnable是串口发送和接收中断的控制的,包括发送中断和接收中断,在这里,我们用的是RXNE 和 TXE中断,代码如下:<br>
        <div style="background-color:#E8E8E8;">
[mw_shl_code=c,true]void vMBPortSerialEnable( BOOL xRxEnable, BOOL xTxEnable )
{
        if(TRUE==xRxEnable)
        {
                USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
        }
        else
        {
                USART_ITConfig(USART1, USART_IT_RXNE, DISABLE);       
        }

        if(TRUE==xTxEnable)
        {
                USART_ITConfig(USART1, USART_IT_TXE, ENABLE);
        }
        else
        {
           USART_ITConfig(USART1, USART_IT_TXE, DISABLE);
        }
}[/mw_shl_code]
        </div>
&nbsp; &nbsp; 而&nbsp;xMBPortSerialInit&nbsp;函数显然是串口初始化的了,因为我在usart.c已经有一个串口初始化函数,这里直接调用该初始化函数usart_init(ulBaudRate);同时将return FALSE 改成 return TRUE; 注意这里我们只用了波特率这个参数,其他参数直接忽略,你也可以根据自己需要改一下。<br>
然后&nbsp;xMBPortSerialPutByte 和&nbsp;xMBPortSerialGetByte 分别是发送和接收一个字节数据的函数,这里我直接调用库函数;<br>
&nbsp;
        <div style="background-color:#E8E8E8;">
[mw_shl_code=c,true]BOOL
xMBPortSerialPutByte( CHAR ucByte )
{
        USART_SendData(USART1, ucByte);
  while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET)/*????·????ê??*/
  {
  
  }               
        return TRUE;
}

BOOL
xMBPortSerialGetByte( CHAR * pucByte )
{
        *pucByte = USART_ReceiveData(USART1);
        return TRUE;
}[/mw_shl_code]
        </div>
&nbsp; &nbsp; 最后还有两个中断处理函数,把前面的static 去掉,因为我不想把我的串口中断函数放到这个文件。然后我们在stm32f10x_it.c添加串口中断函数,如下:<br>
&nbsp;
        <div style="background-color:#E8E8E8;">
[mw_shl_code=c,true]void USART1_IRQHandler(void)
{
        if(USART_GetITStatus(USART1, USART_IT_RXNE) == SET)
        {               
                prvvUARTRxISR();
                USART_ClearITPendingBit(USART1, USART_IT_RXNE);
        }

        if(USART_GetITStatus(USART1, USART_IT_TXE) == SET)
        {
                prvvUARTTxReadyISR();
//                 USART_ClearITPendingBit(USART1, USART_IT_TXE);
        }
}[/mw_shl_code]
        </div>
&nbsp; &nbsp; &nbsp;至此,portserial.c处理完毕。<br>
&nbsp; &nbsp; &nbsp;porttimer.c的移植和portserial.c十分相似,但是要特别注意定时器中断的时间长度应该是3.5个字符时间,我这里只是简单粗暴的按照波特率是9600时候计算的。文件很短,直接上代码<br>
        <div style="background-color:#E8E8E8;">
[mw_shl_code=c,true]BOOL
xMBPortTimersInit( USHORT usTim1Timerout50us )
{
        TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
  
  TIM_DeInit(TIM2);

#if 0        
        TIM_TimeBaseStructure.TIM_Period = 0x7E54;                  //CLK==24MHz ((1000000000/9600)*11*3.5)/(1000/24) == 0x7e54
        TIM_TimeBaseStructure.TIM_Prescaler = 0x3;
#endif
  // ?????????¤·?????????7200/72M = 0.0001,????100us????????1
  //10us x 50 = 5ms,??5ms????????       
  TIM_TimeBaseStructure.TIM_Period = 50;
  TIM_TimeBaseStructure.TIM_Prescaler = (7200 - 1);       
        TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
        TIM_TimeBaseInit(TIM2, &amp;TIM_TimeBaseStructure);
//         TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
        TIM_Cmd(TIM2, ENABLE);
        return TRUE;
}


void
vMBPortTimersEnable(  )
{       
        TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
        TIM_SetCounter(TIM2, 0);
        //TIM_Cmd(TIM2, ENABLE);
        TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
}

void
vMBPortTimersDisable(  )
{
        TIM_SetCounter(TIM2, 0);
        //TIM_Cmd(TIM2, DISABLE);
        TIM_ITConfig(TIM2, TIM_IT_Update, DISABLE);
}

void
TIMERExpiredISR( void )
{
    (void)pxMBPortCBTimerExpired();

}[/mw_shl_code]
        </div>
&nbsp; &nbsp; &nbsp;同样,在stm32f10x_it.c添加定时器中断处理函数,<br>
        <div style="background-color:#E8E8E8;">
[mw_shl_code=c,true]void TIM2_IRQHandler(void)
{
        TIMERExpiredISR();
        TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
}[/mw_shl_code]
        </div>
<br>
&nbsp; &nbsp; &nbsp;然后,我们还需要自己写四个回调函数,分别是读输入寄存器函数、读写保持寄存器函数、读写线圈函数和读离散寄存器函数,一般只用读写保持寄存器函数即可,具体怎么实现可以参考demo文件夹里面众多的demo.c文件。<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>
&nbsp; &nbsp;附近是我的代码,屡试不爽,大家可以参考一下<img src="/static/image/smiley/kindeditor/13.gif" border="0" alt=""><br>
<br>
&nbsp;<br>
<br>
<br>好久没登录这个网站了,今天发现还有朋友在看这个贴子,说附件下载不了了,我就找了一下以前的代码,重新上传了一下<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
</span>
</div>

freemodbus-v1.5.0.zip

5.9 MB, 下载次数: 75540

重新上传

UCOSII_MODBUSRTU_DEMO.zip

8.19 MB, 下载次数: 122746

重新上传

freemodbus-v1.5.0.zip

4.2 MB, 下载次数: 5539

UCOSII_MODBUSRTU_DEMO.zip

998.25 KB, 下载次数: 107

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

6

主题

91

帖子

0

精华

高级会员

Rank: 4

积分
767
金钱
767
注册时间
2014-11-15
在线时间
91 小时
发表于 2016-1-16 08:35:49 | 显示全部楼层
752151619 发表于 2016-1-11 18:08
你用这个代码调试过吗。。。有没什么问题啊。。。

已解决了,问题出在 portserial.c中,是由于库函数的返回值改变了所致。

xMBPortSerialGetByte( CHAR * pucByte)
{
    while (USART_GetFlagStatus(USART3, USART_IT_RXNE) == RESET);
    *pucByte = (u8)USART_ReceiveData(USART3);
    return TRUE;
}

就是那个等待中断的返回值,原来写成了 == 0,检查了库函数代码后,修改成RESET,一切OK!
回复 支持 1 反对 0

使用道具 举报

2

主题

29

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
229
金钱
229
注册时间
2015-1-19
在线时间
26 小时
发表于 2017-2-27 14:10:53 | 显示全部楼层
spfanlost 发表于 2017-2-27 13:58
.\Flash\Obj\output.axf: Error: L6218E: Undefined symbol prvvTIMERExpiredISR (referred from usart.o ...

1声明函数上面声明的static没有删除;2MicroLib并不支援assert(),target中钩掉USE MicroLIB编译就可以通过了
活在当下,静心坚持。
回复 支持 1 反对 0

使用道具 举报

15

主题

786

帖子

5

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3223
金钱
3223
注册时间
2015-7-26
在线时间
811 小时
发表于 2015-12-20 11:11:18 | 显示全部楼层
有用,谢谢分享!
我的博客:http://blog.csdn.net/itdo_just
回复 支持 反对

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
发表于 2015-12-20 11:17:17 | 显示全部楼层
谢谢分享STM32上移植FreeModbus RTU经验,mark备用~~~~~
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复 支持 反对

使用道具 举报

12

主题

126

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
281
金钱
281
注册时间
2013-1-5
在线时间
22 小时
发表于 2015-12-20 12:47:57 | 显示全部楼层
多谢楼主分享
天道酬勤
回复 支持 反对

使用道具 举报

33

主题

481

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
5075
金钱
5075
注册时间
2013-10-4
在线时间
654 小时
发表于 2015-12-20 22:11:19 | 显示全部楼层
谢谢楼主分享
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-12-20 22:56:52 | 显示全部楼层
不错,谢谢分享。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

13

主题

296

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2067
金钱
2067
注册时间
2012-5-26
在线时间
292 小时
发表于 2015-12-21 09:46:37 | 显示全部楼层
谢谢分享,最近可能要用到modbus TCP
活着才是王道!健康是一切的前提!
回复 支持 反对

使用道具 举报

10

主题

81

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1502
金钱
1502
注册时间
2013-8-28
在线时间
28 小时
发表于 2015-12-21 09:52:44 | 显示全部楼层
必须mark
回复 支持 反对

使用道具 举报

6

主题

130

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
437
金钱
437
注册时间
2013-4-9
在线时间
76 小时
发表于 2015-12-21 14:21:58 | 显示全部楼层
楼主不错!!!!
签名必须手写!
回复 支持 反对

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2015-12-28 10:16:50 | 显示全部楼层
NND,我移植这货如果调用打开了printf函数支持,程序就编译不通过,注释掉之后就可以编译通过,下载没法运行,不知道怎么跑的,仿真单步运行都进不了main函数,你有遇到过么?407上第一次移植的用的lib是V1.4版本的库,现在用的是V1.5版本的库,最近移植到103上面也不行,,直接不跑了,没法仿真,不知道这样的情况你有没遇到
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
6
金钱
6
注册时间
2015-12-30
在线时间
1 小时
发表于 2015-12-30 23:41:32 | 显示全部楼层
谢谢 正需要。。。
回复 支持 反对

使用道具 举报

22

主题

147

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3983
金钱
3983
注册时间
2015-4-18
在线时间
403 小时
发表于 2016-1-3 19:56:28 | 显示全部楼层
非常谢谢了。。。。。。。。
回复 支持 反对

使用道具 举报

22

主题

147

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3983
金钱
3983
注册时间
2015-4-18
在线时间
403 小时
发表于 2016-1-5 17:59:56 | 显示全部楼层
你个modebus 程序能直接与威纶触 摸屏通讯吗。。。。
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手上路

积分
27
金钱
27
注册时间
2016-1-10
在线时间
3 小时
发表于 2016-1-10 10:51:34 | 显示全部楼层
LZ的分析对我太有用了,刚开接触modbus,学习中,谢谢
回复 支持 反对

使用道具 举报

6

主题

91

帖子

0

精华

高级会员

Rank: 4

积分
767
金钱
767
注册时间
2014-11-15
在线时间
91 小时
发表于 2016-1-10 16:47:33 | 显示全部楼层
串口直连PC时,用MODBUS调试精灵测试通过,修改至485模块后,由于485存在芯片的发送控制,代码会出现死机的情况,正在分析中。
回复 支持 反对

使用道具 举报

5

主题

30

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
202
金钱
202
注册时间
2014-12-17
在线时间
16 小时
发表于 2016-1-10 19:42:40 | 显示全部楼层
谢谢分享,正在准备学习STM32系统呢
回复 支持 反对

使用道具 举报

0

主题

12

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2015-11-19
在线时间
3 小时
发表于 2016-1-11 16:03:38 | 显示全部楼层
Mark  Thanks!!
回复 支持 反对

使用道具 举报

22

主题

147

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3983
金钱
3983
注册时间
2015-4-18
在线时间
403 小时
发表于 2016-1-11 18:08:37 | 显示全部楼层
Bula 发表于 2016-1-10 16:47
串口直连PC时,用MODBUS调试精灵测试通过,修改至485模块后,由于485存在芯片的发送控制,代码会出现死机的 ...

你用这个代码调试过吗。。。有没什么问题啊。。。
回复 支持 反对

使用道具 举报

9

主题

93

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
426
金钱
426
注册时间
2011-7-11
在线时间
49 小时
发表于 2016-1-11 23:49:28 | 显示全部楼层
mark了,以后用得上
回复 支持 反对

使用道具 举报

6

主题

35

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
421
金钱
421
注册时间
2014-4-1
在线时间
11 小时
 楼主| 发表于 2016-1-15 17:22:43 | 显示全部楼层
八度空间 发表于 2015-12-28 10:16
NND,我移植这货如果调用打开了printf函数支持,程序就编译不通过,注释掉之后就可以编译通过,下载没法运 ...

我也遇到开了printf函数就编译出错,这个时候要加上一个void _ttywrch(int ch)函数就可以了,还有你说进不了main函数这个问题我觉得一般都是因为堆栈设置不对,或者一些其他的设置问题,这个问题我以前用51单片机的时候遇到过,比较麻烦。还有你移植到103上跑不了到底是哪里出问题,不妨贴出来一起研究一下
回复 支持 反对

使用道具 举报

6

主题

35

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
421
金钱
421
注册时间
2014-4-1
在线时间
11 小时
 楼主| 发表于 2016-1-15 17:24:11 | 显示全部楼层
752151619 发表于 2016-1-5 17:59
你个modebus 程序能直接与威纶触 摸屏通讯吗。。。。

没试过,你可以试试,只要遵循相同的协议标准应该是没问题的
回复 支持 反对

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2016-1-16 08:01:45 | 显示全部楼层
菜鸟2 发表于 2016-1-15 17:22
我也遇到开了printf函数就编译出错,这个时候要加上一个void _ttywrch(int ch)函数就可以了,还有你说进 ...

在F407库函数V1.4版本移植那个可以跑,之后再移植一遍就没法跑了,main函数进步了,仿真怎么都没有跑起来,又不是进入HardFault_Handler()函数,明天发代码上来
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

2

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
79
金钱
79
注册时间
2015-11-24
在线时间
32 小时
发表于 2016-1-18 16:42:21 | 显示全部楼层
感谢楼主 MARK 备用
回复 支持 反对

使用道具 举报

53

主题

113

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
437
金钱
437
注册时间
2013-4-10
在线时间
84 小时
发表于 2016-1-24 00:01:26 | 显示全部楼层
第一个寄存器的数读不上来,求分析,解决!谢谢!
04:输入寄存器
/* ----------------------- Defines ------------------------------------------*/
#define REG_INPUT_START 0
#define REG_INPUT_NREGS 4

/* ----------------------- Static variables ---------------------------------*/
static USHORT   usRegInputStart = REG_INPUT_START;
static USHORT   usRegInputBuf[REG_INPUT_NREGS]={0x1111,0x2222,0x3333,0x4444};
/* ----------------------- Start implementation -----------------------------*/
11111.png 3.png

03:保持寄存器
/* ----------------------- Defines ------------------------------------------*/
#define REG_HOLDING_START 0x0000
#define REG_HOLDING_NREGS 8
uint16_t usRegHoldingBuf[REG_HOLDING_NREGS]= {0x147b,0x3f8e(变量),0x147b,0x400e,0x1eb8,0x4055,0x147b,0x408e};


2.png 4.png

打铁还需自身硬@ing
回复 支持 反对

使用道具 举报

suzhao2008 该用户已被删除
发表于 2016-1-24 10:58:08 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

0

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
172
金钱
172
注册时间
2013-3-8
在线时间
34 小时
发表于 2016-1-25 22:34:33 | 显示全部楼层

谢谢分享STM32上移植FreeModbus RTU经验
回复 支持 反对

使用道具 举报

2

主题

9

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2016-1-14
在线时间
6 小时
发表于 2016-1-27 19:30:24 | 显示全部楼层
楼主你好,我想问下我现在做的课题是通过USB传输的PLC Modbus协议移植与验证。然后我也是个新手。老师给我的代码是说通过串口传输的Modbus代码,叫我自己弄一个通过USB传输的Modbus协议移植。我想问下Modbus源码是不是说不需要我们 自己去编写的?我要做的是怎么用USB去传输?
回复 支持 反对

使用道具 举报

2

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
93
金钱
93
注册时间
2015-12-29
在线时间
13 小时
发表于 2016-1-27 23:32:12 | 显示全部楼层
mark  谢谢LZ分享
路漫漫,书多多,stm32的朋友请加群383260480交流,一起进步
回复 支持 反对

使用道具 举报

1

主题

6

帖子

0

精华

初级会员

Rank: 2

积分
70
金钱
70
注册时间
2016-1-4
在线时间
15 小时
发表于 2016-1-28 14:55:02 | 显示全部楼层
mark一下,以后用到慢慢看
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
5
金钱
5
注册时间
2016-2-26
在线时间
0 小时
发表于 2016-2-26 09:45:53 | 显示全部楼层
能问一个问题么?就是用modbus协议的话从机地址是怎么写到板子里的呢?如果是用拨码开关设置的话那主机又是从哪里读取的呢?
回复 支持 反对

使用道具 举报

30

主题

705

帖子

1

精华

新手上路

积分
21
金钱
21
注册时间
2013-3-14
在线时间
52 小时
发表于 2016-2-26 10:08:14 | 显示全部楼层
mark,备用。楼主大赞。
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2016-2-26
在线时间
8 小时
发表于 2016-2-26 10:47:55 | 显示全部楼层
好帖。谢谢楼主分享
回复 支持 反对

使用道具 举报

0

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2012-6-18
在线时间
3 小时
发表于 2016-3-15 14:48:21 | 显示全部楼层
本帖最后由 zjczm 于 2016-3-15 14:52 编辑

文章很好。学习了!
to 楼主,我下载下来的压缩文件,解压后出错。楼主能否重传一下???
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2016-3-16
在线时间
6 小时
发表于 2016-3-16 16:11:58 | 显示全部楼层
谢谢,很有用
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2019-7-8
在线时间
8 小时
发表于 2016-3-20 11:45:41 | 显示全部楼层
先MARK
回复 支持 反对

使用道具 举报

10

主题

109

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4895
金钱
4895
注册时间
2014-3-30
在线时间
500 小时
发表于 2016-3-21 18:03:38 | 显示全部楼层
mark ,学习学习!
从不在失败面前说不,你就会成为人们眼中的大神!!
回复 支持 反对

使用道具 举报

2

主题

23

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
206
金钱
206
注册时间
2016-3-7
在线时间
81 小时
发表于 2016-3-29 10:20:57 | 显示全部楼层
楼主强悍,我与组态王试过可用,美中不足的是 02 读离散寄存器 指令不能用
回复 支持 反对

使用道具 举报

2

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2014-9-4
在线时间
12 小时
发表于 2016-4-1 00:02:08 | 显示全部楼层
多谢分享
回复 支持 反对

使用道具 举报

17

主题

344

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1280
金钱
1280
注册时间
2013-12-14
在线时间
567 小时
发表于 2016-4-1 09:11:16 | 显示全部楼层
有用,mark一下。
半导体->模拟电路->数字电路->单片机->汇编->C->操作系统->java
回复 支持 反对

使用道具 举报

0

主题

63

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3867
金钱
3867
注册时间
2015-8-26
在线时间
285 小时
发表于 2016-4-1 09:16:28 | 显示全部楼层
先顶后看,好习惯
回复 支持 反对

使用道具 举报

4

主题

49

帖子

0

精华

初级会员

Rank: 2

积分
107
金钱
107
注册时间
2015-12-4
在线时间
17 小时
发表于 2016-4-5 09:00:36 | 显示全部楼层
楼主威武
回复 支持 反对

使用道具 举报

10

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
159
金钱
159
注册时间
2014-10-13
在线时间
18 小时
发表于 2016-4-25 16:14:22 | 显示全部楼层
学习一下
回复 支持 反对

使用道具 举报

9

主题

50

帖子

0

精华

初级会员

Rank: 2

积分
128
金钱
128
注册时间
2014-5-28
在线时间
16 小时
发表于 2016-4-28 17:04:31 | 显示全部楼层
在modbus相关的几个文件里,有好几个函数里,有
OS_CPU_SR cpu_sr=0;
这个定义,只是定义了,但从未使用。
回复 支持 反对

使用道具 举报

6

主题

35

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
421
金钱
421
注册时间
2014-4-1
在线时间
11 小时
 楼主| 发表于 2016-7-11 10:59:00 | 显示全部楼层
cxjvae 发表于 2016-1-27 19:30
楼主你好,我想问下我现在做的课题是通过USB传输的PLC Modbus协议移植与验证。然后我也是个新手。老师给我 ...

modbus源码是不用我们去编写的,不过有一部分与应用相关的需要稍微修改一下,用串口或者USB或者 用TCP/IP都是可以的
回复 支持 反对

使用道具 举报

2

主题

49

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
392
金钱
392
注册时间
2016-5-26
在线时间
35 小时
发表于 2016-7-18 18:08:15 | 显示全部楼层
MARK一下
回复 支持 反对

使用道具 举报

13

主题

38

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
274
金钱
274
注册时间
2011-10-27
在线时间
26 小时
发表于 2016-7-19 08:50:00 | 显示全部楼层
mark  dfadfadfas
回复 支持 反对

使用道具 举报

0

主题

10

帖子

0

精华

新手上路

积分
24
金钱
24
注册时间
2016-7-18
在线时间
5 小时
发表于 2016-7-19 09:08:04 | 显示全部楼层
有用的帖子
回复 支持 反对

使用道具 举报

15

主题

61

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
274
金钱
274
注册时间
2016-7-15
在线时间
88 小时
发表于 2016-7-19 11:48:20 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

9

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
170
金钱
170
注册时间
2014-11-16
在线时间
32 小时
发表于 2016-7-21 16:01:27 | 显示全部楼层
太棒了,谢谢lz,正想睡觉呢,送来了枕头
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-4 16:11

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表