西门子两个控制例子的程序设计和编程思路。
一、高速计数器的模拟控制
高速计数器的模拟控制是用S7-200 PLC的高速计数器来累计来自模拟量/频率转换器(A/F)的脉冲来模拟电压值的。假设频率转换器将输入电压(0-10V)转换为矩形脉冲信号(0-2000Hz),再将此信号送入CPU 高速记数器的输入端并累计脉冲数。当预置的间隔时间到后,通过累计脉冲数,计算出被测模拟电压值。
主程序:
主程序中在***个扫描周期调用初始化程序SBR0,仅在***个扫描周期标志位SM0.1=ON时由子程序实现初始化。
子程序:
在子程序中,首先把高速计数器HSC1的控制字节SMB47置为16#FC,其含义是:加计数,可更新预置值(PV),可更新当前值(CV),用指令HDEF把高速计数器HSC1置成工作模式0,即没有复位或起始输入,也没有外部的方向选择。当前值SMD48复位为0,预置值SMD52置为FFFF(十六进制),定时中断0间隔时间SMB34置为100ms,用ATCH指令将中断程序0分配给中断事件10,即定时中断0,并用ENI指令允许中断,用指令HSC启动高速计数器HSC1。
中断程序:
因为定时中断0间隔时间SMB34置为100ms,所以每100ms调用一次中断程序0,读出高速计数器的数值存到VD100,后将其置零。案例是通过频率转换器将输入电压(0-10V)转换为矩形脉冲信号(0-2000Hz),通过HSC1的计数值及变换关系(0-2000kHz对应于0-10V)来求被测的模拟电压值。SHR-DW为右移指令,将VD100的二进制位右移一位,相当于是除于2,也就是将VD100的脉冲数除以2,然后将低位的VB103输出到QB0,以便通过Q0.0~Q0.7的LED来显示被测的电压值,显示值与10倍真实电压值相对应。
关于计算部分,我们举例计算一下,假如计数值为200,200除以2是100,那么被测的模拟电压值就是10.0V。因为计数器100ms内共有200个计数脉冲,这正好与2000Hz-10V相对应, 假设计数值为104,则实际电压值应为5.2V。注意:定时中断间隔时间可在5-255ms的范围内变化,我们可以通过设立一个标志,可根据需要来延长高速计数器的求值和复位时间,这样就有更长的扫描间隔,以便提高***度,同时也会带来更长的更新时间。
二、高速计数器的测速控制
高速计数器的测速控制是利用高速计数器来实现测量转速,比如说测电机的转速。其中会利用到脉冲数和电机转速的计算。设计思路是主程序中调用子程序进行初始化,子程序中做高速计数器及中断的定义,中断程序中做转化计算部分,下面我们详细看一下程序。
主程序:
在PLC上电运行的***个扫描周期执行一次子程序,用于程序运行的初始化设置。
子程序:
在子程序中,首先对VB0和VD0进行清零,VB0用于记录累加数据的次数,VD0累加数据的中间变量。接着设置高速计数器HSC0的控制字节为16#F8,即更新当前值,加计数,用指令HDEF把高速计数器HSC0置成工作模式0,为单相计数输入,没有外部控制功能。当前值SMD38复位为0,定时中断0间隔时间SMB34置为50ms,用ATCH指令将中断程序0分配给中断事件10,即定时中断0,并用ENI指令允许中断,用指令HSC启动高速计数器HSC0。
中断程序:
中断程序是每隔50ms扫描刷新一次,采用加法指令将高速计数器HC0的当前计数值和累加数据变量VD0相加一次,用于数据的累加,同时用递增指令对VB9进行加1,即记录累加的次数,这里再执行一次HSC指令是为了将初始值寄存器SMD38再次写入高速计数器HC0,使当前值为0,以便于下一次的定时采样。
当累加数据的次数等于32次时,执行运算指令,除法指令除以32是计算出累计脉冲数的平均值,乘以100是将平均值转化成以转/分单位的数据,并存到VD4中,用DI_I指令是将双整数转换成整数,存储到VW10中,VW10就是电机的转速,后面的传送指令是对VB0和VD0进行清零,用于下一次重新开始累加。