FreeModBus for AVR IAR工程
M128PD3 INT3/TXD1
PD2 INT2/RXD1
9600 8 N 1 与 Modbus Poll连接地址为1
通信过程中PA7 LED闪烁
为了减小代码空间目前只来了寄存器读与写功能
可以通过头文件打开其它功能
IAR 5.40环境下 代码尺寸为3.8K
好东西,顶起。。。。。 之前自己用if自己写的MOdbus不是特别稳定
配置起来还费劲,直接用别人现成的
在ATMEGA8上用它应该没有压力。 正需要,多谢! 本帖最后由 worldsing 于 2013-8-8 17:53 编辑
再传一个精简版本的:
本帖最后由 worldsing 于 2013-8-8 17:50 编辑
1、硬件连接:
M128
PD3 INT3/TXD1---> PC 232COM Pin 2
PD2 INT2/RXD1---> PC 232COM Pin 3
GND ---> PC 232COM Pin 5
2、Modbus Poll软件配置:
软件下载地址:http://www.cnblogs.com/worldsing/p/3231855.html
9600 8 N 1 与 Modbus Poll连接地址为1
3、状态:
通信过程中PA7 LED闪烁
4、代码信息:只留RTU模式 优化代码
ModbusUser.c 用记功能代码
ModbusFun.c 整合FreeModbus的功能c代码文件;
ModbusRTU.c Modbus的RTU模式桢处理,整理FreeModbus去除ASCII模式;
ModbusPort.c 关于硬件的移植包括串口、定时器、桢队列功能实现(目前是单桢处理);
(此文件是ATMEGA128硬件的代码,其它CPU需要自己移植)
FreeModBus会功能打开时IAR 5.40环境下 代码尺寸为:
5 287 bytes of CODE memory (+ 12 range fill )
941 bytes of DATA memory (+ 14 absolute )
#define MB_FUNC_HANDLERS_MAX ( 16 )//使用的功能码数量
#define MB_FUNC_OTHER_REP_SLAVEID_BUF ( 8 )
#define MB_FUNC_OTHER_REP_SLAVEID_ENABLED (1 ) //报告从设备功能
#define MB_FUNC_READ_INPUT_ENABLED (1 ) //读输入寄存器功能
#define MB_FUNC_READ_HOLDING_ENABLED (1 ) //读保持寄存器功能
#define MB_FUNC_WRITE_HOLDING_ENABLED (1 ) //写操持寄存存功能
#define MB_FUNC_WRITE_MULTIPLE_HOLDING_ENABLED(1 )//写多个操持寄存存功能
#define MB_FUNC_READ_COILS_ENABLED (1 )//读线圈
#define MB_FUNC_WRITE_COIL_ENABLED (1 )//写线圈
#define MB_FUNC_WRITE_MULTIPLE_COILS_ENABLED (1 )//写多个线圈
#define MB_FUNC_READ_DISCRETE_INPUTS_ENABLED (1 )//读离散输入
#define MB_FUNC_READWRITE_HOLDING_ENABLED (1 )//读写多个寄存器
//2013/08/08
优化port.c和rtu.c
http://cache.ourdev.cn/new2012/forum/201308/02/184659n8wja8kuenuuwjr6.png.thumb.jpg {:smile:}{:smile:}{:smile:}{:smile:}{:smile:} 这里面有modbusTCP部分吗? MicroPLC 发表于 2013-8-12 11:26 static/image/common/back.gif
这里面有modbusTCP部分吗?
被我删除了 这回把User.c和function.c合并了,同样的配置,Flash 下降,RAM反了长了点。
4 880 bytes of CODE memory (+ 12 range fill )
977 bytes of DATA memory (+ 14 absolute )
//2013/08/16
线圈BUG解决(后来发现不一定是BUG)
1、eMBException eMBFuncWriteCoil( UCHAR * pucFrame, USHORT * usLen )中的
usRegAddress++;行注释掉,否则输出线圈0永远无法输出,其它的线圈错位。
2、eMBException eMBFuncWriteCoil( UCHAR * pucFrame, USHORT * usLen )中的写操作
while循环改加入 usBitOffset += 8; 否则8以后的线圈无法进行写操作。
while( iNCoils > 0 ){
xMBUtilSetBits( ucRegCoilsBuf, usBitOffset,
( uint8_t )( iNCoils > 8 ? 8 : iNCoils ),
*pucRegBuffer++ );
iNCoils -= 8;
usBitOffset += 8;
}
3、细读后发现,usRegAddress++在每个操作下都有,有可能是原版就是有意这么写的,但这样
有违背MODBU协议,也有就是地址0的所有东西是没法操作到的,修改的版本中已可以操作0址
址。
4、合并User.c和rtu.c
支持,顶顶顶顶 liangws201 发表于 2013-10-17 20:33 static/image/common/back.gif
支持,顶顶顶顶
{:handshake:} 有没有用ICC AVR写的FreeMODBUS呢,我想要参考一下! JudeTse 发表于 2013-10-20 22:23 static/image/common/back.gif
有没有用ICC AVR写的FreeMODBUS呢,我想要参考一下!
把Port.c改就行了,很简单的{:smile:} 学习中。。。。。。。。。。。。。。。。。。。 谢谢分享! 采用状态机要好很多。 楼主,我有个128A modbus调试,联系我,有偿
页:
[1]