




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、技术报告(董志然2012-4-13)一种变流器ModBus通信程序设计方案1. 内容及目的本技术报告提出了一种采用使用DSP实现变流器ModBus通信协议的方法。使用有限的DSP时间及空间资源,完成了变流器机侧控制器与主控PLC之间的Modbus协议的RTU模式数据传输。在现有RS232及RS485接口的基础上,完成了协议底层以及应用层功能,并成功应用于风力机模拟控制实验平台。2. 实现原理及思路Modbus是一种主从方式的通信协议,即仅主设备可以初始化通信过程,从设备需要根据主设备提供的数据信息做出适当的响应。为减小通信开销,采用RTU的传输模式。标准的Modbus使用RS232C、RS42
2、2或者RS485串行接口,分析其通信流程,可见其可工作方式是半双工,本处使用RS232C通信接口实现半双工的通信方式。变流器的控制器DSP2407工作过程中需要完成大量的数据运算及处理,故可利用的剩余的时间与空间资源非常有限,本处采用主循环与中断协调工作的方式完成通信数据帧的校验、解析与包装。3. 软硬件关键技术及控制流程3.1 Modbus协议通信方式及数据格式Modbus通信协议采用主从方式,在同一个网络中有一个主设备及最多达255台从设备,从设备的地址编码为 1255。主设备地址码为0,通信时采用广播方式,可以将消息发送给所有的从设备,从设备收到主设备发送来的地址码后与自己的地址码进行比
3、较,如果一致时则与主设备进行通信。Modbus通信以帧为单位,且定义了这些帧的意义,控制器只要按照协议解释其接收和发送的帧数据,就能与在同一网络中采用同样协议的控制器实现通信。常用的Modbus通信规约有两种:一种是Modbus ASCII格式;一种是Modbus RTU格式。一般来说,数据量少而且主要是文本的通信采用Modbus ASCII规约;数据量大而且是二进制数值的通信多采用Modbus RTU规约。本处正符合Modbus RTU格式特点,故选用第二种。数据格式如表3.1所示。起始标志设备地址功能代码数据CRC校验结束T1-T2-T3-T48Bit8Bitn个8Bit16BitT1-T
4、2-T3-T4表3.1 RTU数据格式使用RTU模式,消息发送至少要以3.5个字符时间的停顿间隔开始。在程序中可以通过定时器完成。传输的第一个域是设备地址。网络设备不断侦测网络总线,包括停顿间隔时间,当第一个域(地址域)接收到,每个设备都进行解码以判断是否发往自己的。在最后一个传输字符之后,一个至少3.5个字符时间的停顿标定了消息的结束。一个新的消息可在此停顿后开始。 整个消息帧必须作为一连续的流转输。如果在帧完成之前有超过3.5个字符时间的停顿时间,接收设备将刷新不完整的消息并假定下一字节是一个新消息的地址域。同样地,如果一个新消息在小于3.5个字符时间内接着前个消息开始,接收的设
5、备将认为它是前一消息的延续。这将导致一个错误,因为在最后的CRC域的值不可能是正确的。地址码可以根据需要自行设置。功能码是通讯信息帧的第二个字节。ModBus通讯规约可定义的功能码范围为1127,其中为用户预留的是6572、100110。根据实际需要,实现了以下功能码功能。#define SCI_READ_HLD_REG 0x03 / word,read N hold_reg #define SCI_READ_AI 0x04 / word,read N input_reg #define SCI_SET_1_HLD_REG 0x06 / word,write 1 hold_reg #defin
6、e SCI_SET_N_HLD_REG 0x10 / word,write N hold_reg #define SCI_MASK_HLD_REG 0x16 / word,mask write N hold_reg #define SCI_SWAP_N_HLD_REG 0x17 / word,read and write N hold_reg#define SCI_INFORMATION 0x2b / read information Modbus通信协议并没有强制规定设备组织数据的方式,从时间复杂度与空间复杂度考虑,统一了变流器数据模型为输入寄存器与保持寄存器两种,且统一编址。Modbus通
7、信主要是完成变流器与主控系统PLC之间的数据交换。故定义变流器Modbus数据表如下所示,以直驱变流器为例:/* * modbus数据 * Version : 1.2sci_bufferNUM 关联变量 变量说明 属性 说明sci_buffer0 r 流水号sci_buffer1 预留.sci_buffer2 grid_data.state r 网侧.系统状态sci_buffer3 grid_data.error r 网侧.故障状态sci_buffer4 grid_data.i_d AQ4 r 网侧.电网D轴电流sci_buffer5 grid_data.i_q AQ4 r 网侧.电网Q轴电流
8、sci_buffer6 grid_data.u_d VQ4 r 网侧.电网D轴电压sci_buffer7 grid_data.u_q VQ4 r 网侧.电网Q轴电压sci_buffer8 grid_data.u_dc VQ4 r 网侧.直流母线电压sci_buffer9 grid_data.breakers r 网侧.接触器状态sci_buffer10 grid_data.temperature1 CQ4 r 网侧.温度1sci_buffer11 grid_data.temperature2 CQ4 r 网侧.温度2sci_buffer12 grid_data.temperature3 CQ4
9、 r 网侧.温度3sci_buffer13 grid_data.i_a_rms AQ4 r 网侧.电网A相电流有效值sci_buffer14 grid_data.i_b_rms AQ4 r 网侧.电网B相电流有效值sci_buffer15 grid_data.i_c_rms AQ4 r 网侧.电网C相电流有效值sci_buffer16 grid_data.u_ab_rms VQ4 r 网侧.电网AB电压有效值sci_buffer17 grid_data.u_bc_rms VQ4 r 网侧.电网BC电压有效值sci_buffer18 grid_data.u_ca_rms VQ4 r 网侧.电网C
10、A电压有效值sci_buffer19 grid_data.p WQ4 r 网侧.有功功率sci_buffer20 grid_data.q VarQ4 r 网侧.无功功率sci_buffer21 grid_data.s VAQ4 r 网侧.视在功率sci_buffer22 grid_data.i_d_ref AQ4 r 网侧.有功电流参考值sci_buffer23 grid_data.i_q_ref AQ4 r 网侧.无功电流参考值sci_buffer24 grid_data.pdp_err 网侧.PDP故障码sci_buffer25 grid_data.temp1 网侧.temp1sci_bu
11、ffer26 can_rx_buffer0 网侧.can通信流水sci_buffer27 system.state r 机侧.系统状态sci_buffer28 system.error r 机侧.故障状态sci_buffer29 i_stator.d AQ4 r 机侧.定子D轴电流sci_buffer30 i_stator.q AQ4 r 机侧.定子Q轴电流sci_buffer31 u_stator.d VQ4 r 机侧.定子D轴电压sci_buffer32 u_stator.q VQ4 r 机侧.定子Q轴电压sci_buffer33 u_dc.value VQ4 r 机侧.直流母线电压sci
12、_buffer34 rotor.n r/minQ0 r 机侧.转子机械转速sci_buffer35 system.breakers r 机侧.接触器状态sci_buffer36 system.low_speed r 机侧.电机转速过低指示sci_buffer37 system.temperature1 CQ4 r 机侧.温度1sci_buffer38 system.temperature2 CQ4 r 机侧.温度2sci_buffer39 system.temperature3 CQ4 r 机侧.温度3sci_buffer40 i_stator.a_rms AQ4 r 机侧.定子A相电流有效值
13、sci_buffer41 i_stator.b_rms AQ4 r 机侧.定子B相电流有效值sci_buffer42 i_stator.c_rms AQ4 r 机侧.定子C相电流有效值sci_buffer43 rms.p WQ4 r 机侧.有功功率sci_buffer44 rms.q VarQ4 r 机侧.无功功率sci_buffer45 rms.s VAQ4 r 机侧.视在功率sci_buffer46 i_stator.d_ref AQ4 r 机侧.无功电流参考值sci_buffer47 i_stator.q_ref AQ4 r 机侧.有功电流参考值sci_buffer48 system.p
14、dp_err r 机侧.PDP故障码sci_buffer49 temp1 机侧.temp1sci_buffer60 system.cmd_for_convertor r w 自动控制指令sci_buffer61 system.i_q_set AQ4 r w 有功电流给定值sci_buffer62 grid_data.i_q_set AQ4 r w 无功电流给定值sci_buffer63 r w 预留.sci_buffer64 system.debug_enable r w Modbus调试使能,can调试使能sci_buffer65 预留.sci_buffer66 system.cmd_for
15、_net r w 网侧调试.控制指令sci_buffer67 grid_data.i_d_kp Q12 r w 网侧调试.电网D轴电流环Kpsci_buffer68 grid_data.i_d_ki Q12 r w 网侧调试.电网D轴电流环Kisci_buffer69 grid_data.i_q_kp Q12 r w 网侧调试.电网Q轴电流环Kpsci_buffer70 grid_data.i_q_ki Q12 r w 网侧调试.电网Q轴电流环Kisci_buffer71 grid_data.u_dc_kp Q12 r w 网侧调试.直流母线电压环Kpsci_buffer72 grid_dat
16、a.u_dc_ki Q12 r w 网侧调试.直流母线电压环Kisci_buffer73 grid_data.i_d_kr Q12 r w 网侧调试.电网D轴电流环Krsci_buffer79 grid_data.i_q_set_zero AQ4 r w 网侧调试.I_Q偏置,用于无功补偿sci_buffer80 grid_data.lvrt_enable r w 网侧调试.自动卸荷使能sci_buffer81 grid_data.lvrt_switch r w 网侧调试.卸荷开关sci_buffer82 grid_data.u_dc_set VQ4 r w 网侧调试.母线电压设定值sci_b
17、uffer83 预留.sci_buffer84 预留.sci_buffer85 system.cmd_for_gen r w 机侧调试.控制指令sci_buffer86 pi_i_stator_d.kp Q12 r w 机侧调试.定子D轴电流环Kpsci_buffer87 pi_i_stator_d.ki Q12 r w 机侧调试.定子D轴电流环Kisci_buffer88 pi_i_stator_q.kp Q12 r w 机侧调试.定子Q轴电流环Kpsci_buffer89 pi_i_stator_q.ki Q12 r w 机侧调试.定子Q轴电流环Kisci_buffer95 i_q_kr_
18、p Q12 r w 机侧调试.定子Q轴电流环Kr_psci_buffer96 i_d_set_zero AQ4 r w 机侧调试.I_D偏置,用于无功励磁sci_buffer97 lvrt_enable r w 机侧调试.自动卸荷使能sci_buffer98 lvrt_switch r w 机侧调试.卸荷开关sci_buffer99 speed_sensor_select r w 机侧调试.速度位置测量方式选择sci_buffer100 mppt_select r w 机侧调试.mppt选择表中前面一组数据为只读,后一组数据可读可写。为了节省通信开销,根据Modbus连续地址操作的特点,将相同
19、属性等需要同时操作的数据放在相邻位置。例如自动控制指令、有功电流给定和无功电流给定三者相邻,则可以通过一条连续地址写指令实现。对于任意功能码,有统一的事务处理流程,如下图所示:此处因条件因素影响,并未完全完成全部事务流程,当检测到Modbus异常时,忽略此条指令,等待下一条指令。更详细的Modbus规约请参考GBT 19582.1-2008 基于Modbus协议的工业自动化网络规范。3.2 难点及解决方案在从主机接收到一帧数据后,首先要进行CRC校验,此为一项耗时操作,此运算无法在一次中断函数中完成。预选方案有两种,一种是每次中断中完成一部分校验工作,直至全部完成;第二种方案是将校验工作交给程
20、序主循环去做,当完成校验运算后通知中断程序进行下一步工作。考虑到同时进行了还有有效值计算等耗时操作,故统一选用第二种方案。3.3 关键代码l 串口及数据初始化函数inline void sci_init(void) unsigned int i; *MCRA |= 0x0003; / 配置串行口引脚为 特殊功能TXD,RXD *SCICCR = 0x87; / 2个停止位,不使能奇偶校验,空闲线多处理器模式,8位字符 *SCICTL1 = 0x03; / 使能接受和发送,SLEEP禁止休眠 *SCICTL2 = 0x00; / 禁止接受和发送中断 *SCIHBAUD = 0x02; *SCIL
21、BAUD = 0x08; / 波特率为9600bps *SCICTL1 = 0x23; / 使SCI脱离复位状态 for(i = 0; i < MODBUS_BUFFER_NUM; i+) sci_bufferi = 0; for(i = 0; i < SCI_RX_DATA_N_MAX; i+) sci_rx_datai = 0; for(i = 0; i < SCI_TX_DATA_N_MAX; i+) sci_tx_datai = 0; sci_rx_crc16_check = 0; sci_rx_state = SCI_IDLE_WAIT; sci_rx_timeou
22、t = SCI_RX_TIMEOUT; sci_rx_data_n = 0; sci_tx_data_n = 0; sci_modbus_rx_flag = 0; sci_tx_en = 0; return;l CRC16初始化及计算函数/ Optimized CRC-16 calculation./ Polynomial: x16 + x12 + x5 + 1 (seed is 0xa001)/ Initial value: 0xffff/ This is the CRC used by the Modbus protocol./ code begininline void sci_rx_c
23、rc16_init(unsigned int s) sci_rx_crc16_seed = s; sci_rx_crc16_value = 0xffff;inline void sci_rx_crc16(unsigned int data) unsigned int i; sci_rx_crc16_value = data & 0x00ff; for (i=0; i<8; i+) if (sci_rx_crc16_value & 0x0001) sci_rx_crc16_value = (sci_rx_crc16_value >> 1) sci_rx_crc1
24、6_seed; else sci_rx_crc16_value >>= 1; / code endl Modbus底层接收函数inline void sci_rx() if( 0 = sci_modbus_rx_flag ) sci_rx_ready = *SCIRXST; sci_rx_ready &= 0x0040; if( 0x0040 = sci_rx_ready ) sci_rx_buf = *SCIRXBUF; switch( sci_rx_state ) case SCI_IDLE_WAIT: case SCI_RECEIVING: case SCI_RECE
25、IVED: break; case SCI_RX_FULL: default: sci_rx_timeout = SCI_RX_TIMEOUT; if( 0 = sci_rx_timeout ) / reset sci_rx switch( sci_rx_state ) case SCI_IDLE_WAIT: break; case SCI_RECEIVING: case SCI_RECEIVED: case SCI_RX_FULL: default: break; else sci_rx_timeout-; l Modbus底层发送函数inline void sci_tx() unsigne
26、d int sci_tx_ready = 0; static unsigned int sci_tx_data_n_c = 0; if( sci_tx_en ) RS485_WE = 1; if( sci_tx_data_n_c = sci_tx_data_n ) / reset sci_tx sci_tx_data_n_c = 0; sci_tx_data_n = 0; sci_tx_en = 0; else sci_tx_ready = *SCICTL2; sci_tx_ready &= 0x0080; if( 0x0080 = sci_tx_ready ) *SCITXBUF = sci_tx_datasci_tx_data_n_c+; else RS485_WE = 0; l Modbus数据处理函数inline void sci_modbus_cmd_progress() if( sci_modbus_rx_flag ) sci_modbus_rx_flag = 0; / 更新数据 sci_buffer = variable sci_buffer0 +; . / modbus指令解析 sci_cmd_word = sci_rx_data1; switch( sci
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 湖北省荆州市南昕学校2024-2025学年数学九上期末达标测试试题含解析
- 海员水手考试试题及答案
- 广东省广州市绿翠现代实验学校2024-2025学年数学九年级第一学期期末质量检测模拟试题含解析
- 四川航天职业技术学院《营销专业实训》2023-2024学年第一学期期末试卷
- 二零二五版厂房租赁合同标准:租赁期限与续约细则
- 二零二五年度水利工程包工不包料合同样本
- 二零二五年智能门禁系统采购与安装服务合同规范
- 2025版涉及核心知识产权的保密及排他性合同样本
- 二零二五年度ISO三体系认证咨询服务合同包含企业内部流程优化
- 二零二五年度校园安保与校园环境保洁服务合同
- 2025年 江西省公安厅警务辅助人员招聘考试笔试试卷附答案
- 2025年抗菌药物培训资料
- 2025年雅思考试写作专项预测试卷:雅思写作高分句型解析
- 购物中心威士忌酒吧行业深度调研及发展项目商业计划书
- 猪场生猪销售管理制度
- 初中教师坐班管理制度
- 2025贵州省水利投资(集团)有限责任公司招聘84人笔试备考题库附答案详解(综合题)
- 页岩气储层表征评价技术进展及其未来发展趋势分析
- 统编版高中政治必修三《政治与法治》期末复习:选择题刷题练习题(含答案解析)
- 四人合伙养猪合同协议
- 保险公司考核工作方案
评论
0/150
提交评论