S7-200通过自由口控制Modbus变频器正负转
西门子S7-200通过自由口需要控制英威腾变频器的正负转 停止和故障复位,运行频率控制以及分二次读取运行速度等12条变频器信息。程序略微变动适应所有Modbus RTU需要控制。 下面是程序,可以直接导入程序后写入PLC试验。 注:程序实例图在文末
ORGANIZATION_BLOCK 主程序:OB1 TITLE= BEGIN Network 1 // 主程序,初始化并查执各变频器指令
一.功能介绍 // 该程序专为英威腾CHF系列变频器编写。英威腾CHF系列变频器内置国际标准的MODBUS通信协议。程序运行时,变频器作为MODBUS协议从站接收来自CPU224 PLC的通信指令,实现起停、频率给定、监控等功能。 // CHF系列矢量变频器在与CPU224通信前须做好以下准备工作: // 1.确认己安装好CHF系列变频器的通讯卡,并将卡上的端口跳线置于RS485端; // 2.用一根带9针阳性插头的串口通信电缆连接在CPU224 PLC的自由通信口端,电缆另一端的第5、3、8线分别接在CHF变频器RS485通讯卡的GND、485+、485一端子上,其余线屏蔽不用; // 3.预先设置变频器以下参数: // PC.00=1 //变频器通讯地址为1 // PC.01=3 //通讯波特率9.6K // PC.02=1 //通讯数据偶校验 8位数据位 1位停止位 // P0.03=2 //变频器的运行指令采用通讯方式 // P3.01=7 //变频器的A频率设定采用通讯方式(注意P3.04/P3.05对P3.01通讯频率的影响)
二.程式结构说明 // 该程序由1个主程序3个子程序及2个中断程序组成。子程序里包含了变频器的起停、复位、查询功能指令,由主程序调用。中断程序为发送及接收指令提供中断支持。 // 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为写入指令;数据地址=2000H为英威腾变频器设置频率的地址;数据内容为写入2000H的内容,范围+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数据写入到变频器地址1的2000H寄存器
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 // 设定英威腾变频器1000H通信控制命令,来控制变频器正负转和停止等操作命令 // 控制变频器运转 英威腾变频器地址1000H 01正转运行 02反转运行 03正转点动 04反转点动 05停车 06自由停车 07故障复位 08点动停车 LDW<> VW304, VW302 //运行命令VW304与接收的返回信息比较,不相等将一直发送下去 A M4.4 S M8.1, 1 //为了把返回信息的保存到VW302寄存器 CALL SBR3, 1, 8, 6, 16#1000, VW304 //把命令内容VW304写入到英威腾变频器的1000H地址
Network 7 // 调用Modbus读取,不要读取范围以外的内容,不然会报错误 // 读取变频器状态3000H 运行速度 3001H 设定速度 3002H 母线电压 3003H 输出电压 3004H 输出电流 3005H 运转速度 // 当有其他重要的读写命令时该通讯暂停 // 分2次读取英威腾变频器3000H~3005H 3008H~3013H信息,本来英威腾变频器说明书说可以连续读取16条信息,不过我读取16条信息返回数据没有CRC校验内容,不知为何,本来是试验程序,有时需要连续读取多条信息,就试验读取2次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.5个字节的传输时间,则PLC默认数据接收开始,此后通讯口上出现的信息即被认为是一个数据帧的内容。同理,随着一个数据帧的最后一个字节传输完成,又会出现一个3.5字节传输时间的空闲间隔,来表示一个数据帧传输的结束。(参见MODBUS协议标准及CHF系列矢量变频器通讯卡使用说明书) // 对9.6K的通信波特率来说,3.5个字节传输时间约为5ms左右。因该程式的每个指令只准备接收一个数据帧的回馈信息,所以接收数据前的空闲检测时间可设为0,即PLC在发出数据后立即开始接收数据,但一个数据帧的传输结束空闲检测时间仍需设为5ms以上。
BEGIN Network 1 LD SM0.0 MOVB 16#49, SMB30 //设置自由通信口格式 MOVW +0, SMW90 //空闲行间隔检测时间0ms 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)输入型局部变量(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
主程序梯形图:
|