恭喜,你发布的帖子
发布于 2023-09-27 17:32:53
25楼
以下是我的测试程序,硬件上Q0.0接线到I0.0,I0.0滤波选了最小的0.2us
ORGANIZATION_BLOCK MAIN:OB1
TITLE=程序注释
BEGIN
Network 1
// Q0.0以20us周期10us脉宽输出脉冲(50KHz)
LD SM0.1
MOVB 16#81, SMB67
MOVW 20, SMW68
MOVW 10, SMW70
PLS 0
Network 2
// I0.0接收Q0.0输出脉冲进行计数,在计数到1000000进入中断0
LD SM0.1
LPS
MOVB 16#F8, SMB37
MOVD 0, SMD38
MOVD 1000000, SMD42
HDEF 0, 0
ATCH INT0, 12
AENO
ENI
LPP
HSC 0
Network 3
// 以250ms为周期产生定时中断,每隔250ms进入中断1
LD SM0.1
MOVB 250, SMB34
ATCH INT1, 10
AENO
ENI
END_ORGANIZATION_BLOCK
SUBROUTINE_BLOCK SBR_0:SBR0
TITLE=子程序注释
BEGIN
Network 1
// 程序段注释
END_SUBROUTINE_BLOCK
INTERRUPT_BLOCK INT_0:INT0
TITLE=中断例程注释
BEGIN
Network 1
// 计数中断读HC0当前值获得中断响应延迟
LD SM0.0
MOVD HC0, VD0
END_INTERRUPT_BLOCK
INTERRUPT_BLOCK INT_1:INT1
TITLE=中断例程注释
BEGIN
Network 1
// 250ms定时中断获取当前HC0值减去上次值从而计算出两次定时中断期间HC0的计数差
LD SM0.0
MOVD HC0, VD4
MOVD VD4, VD12
-D VD8, VD12
MOVD VD4, VD8
Network 2
// 程序段注释
END_INTERRUPT_BLOCK
从监控数据看高计中断响应延迟在60us 左右,250ms 的定时中断读得的高计差值在12500。当脉冲频率提升到100KHz时高计中断响应延迟仍在60us 左右,250ms 的定时中断读得的高计差值在25001.数据是符合预期的。
1、 谢谢分享代码。试过了,我这里的测试不理想,中断响应时间还是很长,而且定时中断读差值也跳得厉害。原因找到了,我第一次用PLC,找朋友拿来试的,现在说是一台没有绿标的,是一台国产的。
你这个思路挺好的,用一次HSC0的比较中断,在中断中再读HC0值来得到中断响应时间。学习了。谢谢一起研究,也谢谢各位回复的朋友。
2、这台国产的,暴露了三个问题,一个是时基不准;另一个是中断里读HC0的值算差值跳变得历害(差很多);还有一个是HSC复位影响计数。最后一个问题,按网友说法,可能原装的也有。最终等我搞到原装的,这几方面再验证一下。
3、主帖是我第一次发帖,是一段一段粘上去的,现在看了winter938发的,质量比我的好。研究了一下,是通过导出.awl文件来的,winter938的程序我也是修改成这种文件导入的。所以,我是新手,要不断学习。
4、发一次贴,还是要有始有终,我也把最新程序全部帖上来。有需要的建一个文本文件,复制贴上去,改后缀为.awl,用STEP 7-MicroWIN SMART导入就好了。我用的是V2.7。
硬件接线是:
Q0.1接I0.0(Q0.0估计坏了,产生不了PWM了),产生和测量标准1khz
Q0.3接I0.3和I0.6,频率自己去变,当作被测频率。
Q0.5接随便哪个没用的输入,形成回路。比较中断中取反立即输出,用于仪器测真实周期。
输入滤波是I0.0\I0.3\I0.6选0.2ms,后面打勾。
调试时图表状态看的地址是:
VD4 1000次比较中断后再读的HC0值,真实时间,这台PLC是1012/1013(次或ms)
VD20 中间间所用的系统时间间隔。这台是864(ms)
VD8 /VD24 被测脉冲差值。 这台是1012/1013(次)
ORGANIZATION_BLOCK MAIN:OB1
TITLE=PWM1用于产生标准频率,输出口Q0.1(不用PWM0,因为Q0.0坏了)
// PWM2用于产生被测频率,输出口Q0.1
// 用三个高速计数器,其中,HSC0脚位I0.0接Q0.1,并用比较1000次中断,用于获得准确时间
// HSC3和HSC4用于测试被测频率,输入口分别是I0.3和I0.6
// 中断里HSC3和HSC4不要重置。重置就测不准。主程序里算前后两次的差值
BEGIN
Network 1
// 程序段注释,
LD SM0.1
CALL SBR0
CALL SBR3
CALL SBR1
CALL SBR2
CALL SBR4
BITIM VD12
ENI
Network 2
LD SM0.5
DISI
MOVD VD16, VD20
MOVD VD4, VD4
MOVD VD32, VD8
-D VD28, VD8
MOVD VD40, VD24
-D VD36, VD24
ENI
END_ORGANIZATION_BLOCK
SUBROUTINE_BLOCK PWM1_gen:SBR0
TITLE=产生标准1kHz,由Q0.1输出,提供给I0.0主速计数。1000次产生中断INT12,实际时间间隔是1012/1013。
BEGIN
Network 1
// PWM::时基1us,周期1000us,脉冲宽度500us。即50%占空比。高速脉冲0,Q0.1直接输出
LD SM0.1
MOVB 16#80, SMB77
MOVW 1000, SMW78
MOVW 500, SMW80
PLS 1
END_SUBROUTINE_BLOCK
SUBROUTINE_BLOCK HSC0_INIT:SBR1
TITLE=I0.0高速计数初始化。接输入源Q0.1,其是1kHz输出。目的是得到比较准确的时间。
// 初始化里后设置开中断(主程序里),1000次达到时中断,12号,中断子程序INT_12。
// 实际并不是1000次,中断里取数是1012/1013次。
//
BEGIN
Network 1
// 要在程序中启用该组态,请在MAIN主程序中使用SM0.1或者沿触发指令调用一次该子程序。
// 针对组态 HC1 模式 0;CV = 0; PV = 100; 加计数;
// 启用中断并启动计数器.
//
LD SM0.0
MOVB 2#11111100, SMB37 //置位控制位: 加计数; 已启用;
MOVD +0, SMD38 //装载 CV
MOVD 1000, SMD42 //装载 PV
HDEF 0, 0
ATCH INT0, 12
HSC 0
END_SUBROUTINE_BLOCK
SUBROUTINE_BLOCK HSC3_INT:SBR2
TITLE=高速计数,PV无所谓,不开中断。I0.3,模式0,加计数
BEGIN
Network 1
LD SM0.0
MOVB 2#11111100, SMB137 //置位控制位: 加计数; 已启用;
MOVD +0, SMD138 //装载 CV
MOVD 10000, SMD42 //装载 PV
HDEF 3, 0
HSC 3
END_SUBROUTINE_BLOCK
SUBROUTINE_BLOCK PWM2_gen:SBR3
TITLE=产生频率,用于模拟被测信号。可以改改频率多次试验
BEGIN
Network 1
// PWM::时基1us,周期和脉宽为XXX。即50%占空比。高速脉冲2,Q0.3直接输出
LD SM0.1
MOVB 16#80, SMB567
MOVW 500, SMW568
MOVW 150, SMW570
PLS 2
END_SUBROUTINE_BLOCK
SUBROUTINE_BLOCK HSC4_INT:SBR4
TITLE=高速计数,PV无所谓,不开中断。I0.6,模式0,加计数
BEGIN
Network 1
LD SM0.0
MOVB 2#11111100, SMB147 //置位控制位: 加计数; 已启用;
MOVD +0, SMD148 //装载 CV
MOVD 10000, SMD152 //装载 PV
HDEF 4, 0
HSC 4
END_SUBROUTINE_BLOCK
INTERRUPT_BLOCK INT_12:INT0
TITLE=HSC0达到1000次产生中断。理论上是1s,实测是1012/1013,方法是一次中断完成一次输出Q0.5取反。频率计测量2026ms。
// 程序里同时获取系统ms值,只有864,说明系统标示1ms比实际慢。864/1000=1172,正好跟用中断0的方案高速计数1kHz得到1172相符。
// 每次中断复位HSC0.
// 千万不要HSC3/HSC4复位,它们用于外部转速脉冲次数测量,复位测不准,分别是971和985。
BEGIN
Network 1
// 此段用于计算两次中断间的系统计时差(ms)
LD SM0.0
CITIM VD12, VD16
BITIM VD12
Network 2
// Q0.5输出,在每次中断里取反立即输出。可以用频率计实测实际采样时长,是1013的两倍。
LD SM0.0
INCB VB1
AB>= VB1, 2
=I Q0.5
MOVB 0, VB1
Network 3
// 程序段注 释
LD SM0.0
MOVD HC0, VD4
MOVD VD32, VD28
MOVD VD40, VD36
MOVD HC3, VD32
MOVD HC4, VD40
MOVB 2#11001100, SMB37
MOVD +0, SMD38
HSC 0
Network 4
LD SM0.0
CRETI
END_INTERRUPT_BLOCK
再次谢谢大家!
请填写推广理由:
分享
只看
楼主