S7-200CN PTO 脉冲输出驱动器 1驱动器 0利用 Micro/Win 指令库实现简单组态脉冲输出用于 √ 控制步进或饲服电机的转速50%Off50%On50%Off50%On周期单速连续转动由程序进行控制,直至新的命令(如放弃)发出相对位置开始位置结束位置从开始点测量SM0.0I0.0Q0_0_MoveRel˜ENEXECU˜Num_P˜VelocityDirectionDoneQ0.0Q0.0Q0.1S7-200CN PWM(脉宽调制)放大器 1放大器 0通过 Micro/Win 组态向导令组态过程更加简便!PWM 用于 √ 速度控制√ 位置控制√ 占空比控制通过 PWM√ 电机从停止到全速运行整个过程的速度控制√ 阀门从关闭到完全打开整个过程的位置控制SM0.0I0.0ENRUN1010000CyclePusleErrorVB10PWM0_RUN脉冲宽度时间周期脉冲宽度时间Q0.0Q0.1S7-224XP CN 或 S7-224XPsi CNS7-224XP CNS7-224XPsi CN
近在热线上遇到一个Case。
客户用300PLC+WInCC(7.4.1.0)来检测现场的液位变化,当检测到液位超过一定值过后,在程序中将PLC中一个Bool量置位,再用这个Bool量来触发一条WinCC报警消息,用于提示液位超限。在这条报警消息中,客户使用了一个过程值块用于显示报警当时的实时液位数值,但是,客户发现,在每次报警消息到来的时候,当前消息里的过程值变量,永远都是显示的上一个周期的液位值。
对于客户的这个需求,一般会直接建议客户在WinCC中做模拟量报警,能够比较直观的显示限位值和当前值。如图1所示,例如用MW100来表示液位,液位的上限值为50,这样就组态好一条简单的模拟量报警,在模拟量报警消息中的消息文本中,已自动生成要显示的限位和当前值内容,如图2所示。值得说明的是,对于模拟量报警,编号1-3的过程值块是系统占用的,而其余的过程值块并不能使用(详见帮助-建立消息系统-限制值监控的消息)。
图1 组态模拟量报警
图2 模拟量报警消息文本
虽然问题很容易解决,但是出现上述问题的原因却是值得深思的。试想客户若不是做这样的功能,而是对于该变量有很高的实时性要求,那这样的现象是肯定不允许发生的,鉴于这一点,我复现了客户的问题,尝试去了解一下深层次的原因。
在Step7(V5.6)和Portal(V15)中分别为300和1500编写了一样的程序,用于对比两款PLC表现是否*。其中MW90代表液位,MW100代表比较值,M80.0用于触发报警消息,300的程序如图3所示(经测试1500的表现和300*,这里不再赘述)。
图3 300PLC液位比较程序
采用Step7的仿真器仿真程序,测试后发现情况如客户所言,程序里涉及到的三个变量,在报警控件里显示的都是上一个周期的值,如图4所示。
图4 通过程序触发过程值显示的值
尝试避开程序,在WinCC中通过IO域直接给MW90和MW100赋值,并手动将M80.0置位,以此触发报警,同时记录MW90和MW100的值,发现记录正常,没有延迟(图5),但是, M80.0依然是上一个周期的值。
图5 避开程序触发过程值显示的值
在报警消息历史记录中可见,当消息离开时,显示的都是实时值,如图6。
图6 报警离开时过程值显示的值
综上,考虑是变量扫描周期的问题,查询手册得知:WinCC写入变量到PLC中,不需要参与循环周期,除开通讯时间和PLC执行周期(ms级),几乎是实时的;但是,报警消息里面的变量(包括触发变量、确认变量、状态变量以及过程值),它们默认有1s的扫描周期。
在一次测试中,消息已经触发,但过程值变量都没有及时刷新;
在第二次测试中,由于MW90和MW100在消息触发时已经有值,所以消息到来时及时刷新了;而消息触发时,过程值变量M80.0(也是触发变量)没有刷新,这也就说明了,即使WinCC已经知道M80.0置位了(因为消息已经触发),但它并不知道,同时作为过程值的M80.0的当前值。
按理说,触发变量和过程值的默认扫描周期都是1s,应该在消息触发时,同时更新过程值才对,但是事实并非如此。那么,可以推测,报警触发时,过程值还没有到,也就是说触发变量和过程值虽然都是1s的扫描周期,但其实每次触发变量都会比过程值变量先到一点点,即触发变量的轮询周期要快于或等于过程值的轮询周期。
去注册表内修改这两个变量的轮询周期,注册表的路径如下:
HKEY_LOCAL_MACHINESOFTWAREWow6432NodeSIEMENSWINCCAlarm LoggingConstants
在这里添加触发变量和过程值变量的轮询周期值:
"CycleAlarms"= "00000000" // 触发变量
"CyclePValues"= "00000000" // 过程值变量
并将触发变量的值改为大于过程值变量的值,例如(图7):
"CycleAlarms"= "00000003" // 触发变量,1s
"CyclePValues"= "00000002" // 过程值变量,500ms
图7 在注册表中修改轮询时间
修改后再次测试,显示正常,如图8。
通道诊断里的扫描周期显示如图9,可以看到,因为有三个过程值(M80.0, MW90, MW100),所以500ms的扫描周期注册了三个变量,而触发变量只有一个,所以1s的扫描周期注册了一个。
图8 修改注册表后过程值显示正常
图9 WinCC注册的扫描周期
测试到这里先告一段落,但是依然还是有个问题没有解决,那就是默认都是1s扫描周期的触发变量和过程值,为什么到报警消息中的时间会有一个差值,从而导致过程值的刷新永远慢一个周期,还是说有其他什么因素影响?这是需要进一步探讨的问题。
S7-200CN PWM(脉宽调制)放大器 1放大器 0通过 Micro/Win 组态向导令组态过程更加简便!PWM 用于 √ 速度控制√ 位置控制√ 占空比控制通过 PWM√ 电机从停止到全速运行整个过程的速度控制√ 阀门从关闭到完全打开整个过程的位置控制SM0.0I0.0ENRUN1010000CyclePusleErrorVB10PWM0_RUN脉冲宽度时间周期脉冲宽度时间