S7-200通过自由口控制Modbus变频器正负转
西门子S7-200需要通过自由口控制英威腾变频器的正负转动 12条变频器信息,如停止和故障复位、操作频率控制和二次读取操作速度。程序的轻微变化适应所有变频器Modbus RTU需要控制。 下面是程序,可以直接导入程序后写入PLC试验。 注:程序实例图在文末
ORGANIZATION_BLOCK 主程序:OB1 TITLE= BEGIN Network 1 // 各变频器指令的主程序初始化和查执
一.功能介绍 // 这个程序是专门为英威腾设计的CHF编写一系列变频器。CHF系列变频器内置国际标准MODBUS通信协议。当程序运行时,变频器被用作MODBUS协议从站接收CPU224 PLC实现起停、频率给定、监控等功能。 // CHF系列矢量变频器在和CPU通信前必须做好以下准备工作: // 1.确认安装好CHF该系列变频器的通讯卡将卡上的端口跳线放置在RS485端; // 2.用带9针阳性插头的串口通信电缆连接CPU224 PLC在自由通信端,电缆另一端的第5、3、8线分别连接CHF变频器RS485通讯卡的GND、485 、485端子上没有其他屏蔽线; // 3.提前设置变频器以下参数: // PC.00=1 ////变频器通信地址1 // PC.01=3 ///通信波特率9.6.6K // PC.02=1 //通信数据偶校验 8位数据位 1位停止位 // P0.03=2 ////变频器运行指令采用通信方式 // P3.01=7 ///变频器的A频设置采用通信方式(注意)P3.04/P3.05对P3.01通信频率的影响)
二、程式结构说明 // 该程序由一个主程序、三个子程序和两个中断程序组成。子程序包含由主程序调用的变频器启停、复位和查询功能指令。中断程序为发送和接收指令提供中断支持。 // main ///主程式,每个变频器指令的初始化和检查 // sbr0 //CRC校验子程序 // sbr1 //// // sbr2 ///发送变频器入06/读取03指令,共8个字节 // intO ///接收完成中断程序 // int1 //发送完成中断程序 LD SM0.1 CALL SBR1 ///调用初始化子程序使能PORT0自由口模式
Network 2 // 接收完成后延迟10mS M4.4接通,下次运行数据发送 LDN M4.0 AN M4.1 TON T35, 1 // 通信完成后延迟10mS M4.4=1,允许下一次通信, A T35 = M4.4 主要是为了Modbus RTU二次通信中间3.5字符间隔时间
Network 3 // 如果发送或接收超时,延迟0.2秒复位M4.0/M4.1.为了方便调试,这里暂时设置5秒 LD M4.0 O M4.1 TON T199, 50 A T199 R M4.0, 2 ///发送或接收超过0.2秒未完成,复位发送/接收
Network 4 // 调用Modbus06写入指令,通信成功,这里暂时不使用,可以设置打手频率,不知道是否支持广播写入,广播写入主要是变频器故障复位和三个打手频率设置.如果需要给棉变频器,需要使用PID没有必要使用控制PLC的PID // 当VW110≠VW300时把VW110写入变频器,VW110范围( 10000~-10000)÷10000×50Hz // 地址为变频器地址;字节数=8字节;指令=03为读取指令,06为写入指令;数据地址=2万H为英威腾变频器设置频率地址;数据内容为2万H内容,范围 10000~0~-10000 // 如果操作命令没有完成,程序将继续执行,直到操作命令完成 LDN M8.1 ///没有发送运行命令,当运行命令发送时,频率无法写通信 AW<> VW300, VW110 //发送的数据VW110与通信完成返回的数据不同 A M4.4 //允许发送 S M8.0, 1 ///发送编写运行速度命令以保存信息VW300用 CALL SBR3, 1, 8, 6, 16#2000, VW110 //把VW110数据写入变频器地址12000H寄存器
Network 5 // 控制变频器正负转 停止和故障复位 同时,在多个输入时执行最终指令 LD SM0.0 LPS A I5.1 //操作命令 MOVW 1, VW304 LRD A I5.3 //逆转命令 MOVW 2, VW304 LRD A I5.2 ///停车命令 MOVW 5, VW304 LPP A I5.4 ///故障复位命令 MOVW 7, VW304
Network 6 // 设置10000英威腾变频器H通信控制命令控制变频器的正负转动和停止 // 控制变频器运行 英威腾变频器地址10000H 01正转运行 02反转运行 03正转点动 04反转点动 05停车 06自由停车 07故障复位 08点动停车 LDW<> VW304, VW302 //操作命令VW与收到的返回信息相比,304将继续发送不相等的信息 A M4.4 S M8.1, 1 ///保存返回信息VW302寄存器 CALL SBR3, 1, 8, 6, 16#1000, VW304 ///命令内容VW30410000英威腾变频器H地址
Network 7 // 调用Modbus阅读时,不要阅读范围以外的内容,否则会报错 // 读取30000个变频器状态H 运行速度 3001H 设定速度 3002H 母线电压 3003H 输出电压 3004H 输出电流 3005H 运转速度 // 当有其他重要的读写命令时,应暂停通信 // 英威腾变频器3000H~3005H 3008H~3013H本来英威腾变频器说明书说可以连续读取16条信息,但是取16条信息返回数据没有CRC不知为什么,验证内容原本是一个测试程序,有时需要连续读取多个信息,两次读取12个信息 LDN M8.0 AN M8.1 ///程序只不发送写频率和操作命令时,可以读取变频器数据 A M4.4 LPS //调用查询变频器 INCB VB270 //启动T37延迟断开计时器 A V270.0 S M8.2, 1 MOVW 16#3000, VW272 //读取3000H连续6条开头信息 LRD AN V270.0 S M8.3, 1 MOVW 16#3008, VW272 //读取3008H连续6条开头信息 LPP CALL SBR3, 1, 8, 16#03, VW272, 6 END_ORGANIZATION_BLOCK SUBROUTINE_BLOCK 初始化:SBR1 TITLE=初始化子程序 // 该程序在PLC第一个扫描周期主要设置CPU224自由端口的通信格式、数据接收格式和复位寄存区(见西门子)S7-200编程手册)。 // 通信格式包括波特率9.6K、每字节位数8位,偶校验等(注意与变频器一致)。 // 完全参照数据接收格式MODBUS RTU格式设置不少于3.通信口的空间间隔作为数据接收的开始和结束信号,具有5个字节传输时间。根据协议,PLC在准备接收数据之前,监控通信口是否空闲,如连续空闲时间超过3.五个字节的传输时间,PLC默认数据接收开始,然后通信口上的信息被认为是数据帧的内容。同理,随着一个数据帧的最后一个字节传输完成,又会出现一个3.5字节传输时间的空闲间隔表示数据帧传输的结束。(参见MODBUS协议标准及CHF使用系列矢量变频器通信卡说明书) // 对9.6K就通信波特率而言,3.55个字节的传输时间约为5ms左右。由于该程序的每个指令只准备接收数据帧的反馈信息,因此在接收数据之前的空闲检测时间可以设置为0,即PLC数据发布后立即开始接收数据,但数据帧的空闲检测时间仍需设置为5ms以上。
BEGIN Network 1 LD SM0.0 MOVB 16#49, SMB30 ////设置自由通信口格式 MOVW 0, SMW90 //ms MOVW 5, SMW92 ///字符问定时器超时检测时间5ms MOVB 20, SMB94 ///最大缓冲区20字节 MOVB 148, SMB87 ////设置自由通信口的数据接收格式 FILL 0, MW8, 1 ////输出印象寄存区复位 FILL 0, MW9, 1 //标志寄存区复位 FILL 0, VW100, 5 //发送缓冲区复位 FILL 0, VW200, 5 //接收缓冲区复位 ATCH INT2, 23 //接收完成中断 ATCH INT1, 9 //发送完成中断 ENI //中断全局启用 END_SUBROUTINE_BLOCK SUBROUTINE_BLOCK CRC校验:SBR2 TITLE= CRC校验子程序 // 英威腾CHV系列矢量变频器内置MODBUS协议采用RTU使用传输格式CRC验证方法验证每次发出或接收的数据帧。因此,该子程序采用多个局部变量,方便其他子程序调用。 // 在西门子STEP 7-Micro/win在编程环境下(如图1所示),应在子程序的局部变量表中预先设置以下局部变量: // (1)输入型局部变量(VAR INPUT) // ld 0:DWORD:///待发数据地址指针变量 // 1w 4:WORD; ///数字变量要发送数据字节 // (2)输出型局部变量(VAR-OUTPUT) // lb 6:BYTE;//CRC高位变量验证值 // lb 7:BYTE;//CRC低位变量验证值// (3)临时局部变量(VAR) // 1w 8:WORD; //待发送数据字节个数计数变量 // 1w 10:WORD;//待发送数据每字节8位二进制数计数变量 VAR_INPUT LD_0:DWORD; // 待发送数据地址指针变量 LW_4:WORD; // 待发送数据字节个数变量 END_VAR VAR_OUTPUT IB_6:BYTE; // CRC校验值高位变量 LB_7:BYTE; // CRC校验值低位变量 END_VAR VAR LW_8:WORD; // 待发送数据字节个数计数变量 LW_10:WORD; // 待发送数据每字节8位二进制数计数变量 END_VAR BEGIN Network 1 // //将16位CRC校验寄存器LW6全置为1 LD SM0.0 MOVW 16#FFFF, LW6 //将16位CRC校验寄存器LW6全置为1
Network 2 // //对待发送数据字节个数(Lw4)计数(Lw8)循环 LD SM0.0 FOR LW8, +1, LW4 //对待发送数据字节个数(Lw4)计数(Lw8)循环
Network 3 // //使待发送数据的第一个字节(*LD0)与CRC校验寄存器低位字节(LB7)进行异或运算 LD SM0.0 XORB *LD0, LB7 //使待发送数据的第一个字节(*LD0)与 //CRC校验寄存器低位字节(LB7)进行异或运算 Network 4 // //ld 0指向待发送数据的下一个地址 LD SM0.0 INCD LD0 //ld 0指向待发送数据的下一个地址 Network 5 // //对每字节8位二进制数计数(LW10)循环 LD SM0.0 FOR LW10, +1, +8 //对每字节8位二进制数计数(LW10)循环
Network 6 // //CRC校验寄存器LW6右移一位 LD SM0.0 SRW LW6, 1 //CRC校验寄存器LW6右移一位
Network 7 // //若移位后的溢出值SMl.1为1,则使值16#A001与LW6进行异或运算 LD SM1.1 //若移位后的溢出值SMl.1为1 XORW 16#A001, LW6 //则使值16#A001与LW6进行异或运算
Network 8 // //结束每字节8位二进制数计数循环 NEXT //结束每字节8位二进制数计数循环 Network 9 // //结束每数据帧字节个数计数循环 NEXT //结束每数据帧字节个数计数循环 END_SUBROUTINE_BLOCK SUBROUTINE_BLOCK Modbus读写:SBR3 TITLE= 三.PLC内存使用说明 // 西门子S7-200系列PLC的自由通讯端口编程必定会用到两个指令,即XMT(发送)指令和 // RCV(接收)指令。编写程序时需要为这两个指令指定数据缓冲区,一般以最低位数为0的地 // 址作为数据缓冲区的起始地址。 // 1.发送指令XMT缓冲区(写/读) // VB100 //xmt指令要发送的字节个数 // VB101 //变频器通讯地址(01) // VB102 //modbus功能码(06/03) // VW103 //变频器被写地址/变频器被读起始地址 // VW105 //被写数据/被读数据字个数 // VB107 //被发送数据CRC低位 // VB108 //被发送数据CRC高位 VAR_INPUT 地址:BYTE; // 变频器地址,字节 字节:BYTE; // 发送字节数 指令:BYTE; // 读16#03 写16#06 数据地址:WORD; // 需要写的变频器参数地址 数据内容:WORD; END_VAR BEGIN Network 1 LD SM0.0 MOVB LB1, VB100 //XMT指令要发送的字节个数 MOVB LB0, VB101 //变频器地址(01) MOVB LB2, VB102 //modbus写功能码(06) MOVW LW3, VW103 //变频器频率设定值地址 MOVW LW5, VW105 //频率设定值 CALL SBR2, &VB101, 6, VB108, VB107 //调用CRC校验子程序 XMT VB100, 0 //将缓冲区(VBl00~VBl08)数据由0端口发送
S M4.0, 1 INCW VW4004 END_SUBROUTINE_BLOCK INTERRUPT_BLOCK 发送完成:INT1 TITLE=发送完成中断子程序 BEGIN Network 1 // //数据接收开始 LD SM0.0 RCV VB200, 0 //数据接收开始
Network 2 // 发送完成中断中复位M4.0,置位M4.1 监控程序是否因发送超时还是接收超时 LD SM0.0 R M4.0, 1 S M4.1, 1 END_INTERRUPT_BLOCK INTERRUPT_BLOCK 接收完成:INT2 TITLE=接收完成中断程序 // 利用西门子S7_200系列PLC提供的系统中断事件,使发送指令XMT及接收指令RCV完成时自动产生程序中断,以便及时完成其它必要的程序操作。 // 这里程序只利用VB205来反映变频器工作状态。 // 2.接收指令RCV缓冲区 // VB200 //rcv指令要接收的字节个数 // VB201 //变频器地址(01) // VB202 //modbus功能码(06/03) // VW203 //变频器被写地址/被读数据字节个数 // VW205 //被写数据/被读数据 // VB207 //被接收数据CRC低位 // VB208 //被接收数据CRC高位 // VB217 //被接收数据CRC验算低位 // VB218 //被接收数据CRC验算高位 BEGIN Network 1 // 网络标题 // M8.2=0是8位字节写指令,返回数据也是8个字节,校验数据有6个字节VB201~VB206,VB257 VB258(VW257)是校验码。同时比较校验码与实际计算校验码是否正确,正确后M10.1置位1 LDN M8.2 //非读取信息时,因读取信息返回数据字节数因信息不一样而不同 LPS //写信息返回字节数固定不变,均为8字节接收信息 R M4.1, 1 CALL SBR2, &VB201, 6, VB258, VB257 //接收接收到的信息VB201开头连续6个字节的CRC值,见过保存到VW257 AW= VW257, VW207 //比较接收信息的CRC位VW207与实际计算的CRC是否相等,相等说明信息正确 S M10.1, 1 //信息正确,M10.1置位1 LPP AW<> VW257, VW207 R M10.1, 1 //信息校验错误,M10.1=0
Network 2 // 如果是读取信息命令(2次读取均是读取6条信息,返回信息数17字节) LD M8.2 //第一条读取命令 O M8.3 //第二条读取命令 LPS R M4.1, 1 CALL SBR2, &VB201, 15, VB258, VB257 //校验VB201开头连续15字节接收信息的CRC校验值 AW= VW216, VW257 S M10.2, 1 LPP AW<> VW216, VW257 //接收信息CRC校验位与实际接收的信息计算的CRC结果比较,如果相等说明计算信息正确
R M10.2, 1 Network 3 // 如果是第一条读取信息,则返回信息保存到VW1000开头的连续6字 LD M8.2 A M10.2 MOVW VW204, VW1000 MOVW VW206, VW1002 MOVW VW208, VW1004 MOVW VW210, VW1006 MOVW VW212, VW1008 MOVW VW214, VW1010 R M8.2, 1 Network 4 // 如果是第二条读取信息,则接收到的信息保存到VW1012开头的连续6个字 LD M8.3 A M10.2 MOVW VW204, VW1012 MOVW VW206, VW1014 MOVW VW208, VW1016 MOVW VW210, VW1018 MOVW VW212, VW1020 MOVW VW214, VW1022 R M8.3, 1 Network 5 // 写英威腾变频器H2000数据,如果返回数据正确,M8.0复位0,VB310清零 LD M10.1 A M8.0 MOVW VW205, VW300 R M8.0, 1 Network 6 LD M10.1 MOVW VW203, VW312 MOVW VW205, VW302 R M8.1, 1
Network 7 END_INTERRUPT_BLOCK
主程序梯形图: