求教,vb里对变量值持续5秒后进行计算

lsdouli 2017-09-30 08:29:31
比如,text1的值为1,当它5秒后,仍然为1,则s=9 ,5秒内text1值变为0(注意是5秒内),则s=0
这样的语句如何编写呢?需要timer控件吧?
问题的重点是判断text1是否在5秒内变0,如果5秒内一直为1,则s赋值一个值。
有大神教教我啊
...全文
1166 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
of123 2017-10-11
  • 打赏
  • 举报
回复
引用 22 楼 lsdouli 的回复:
大家好,这个代码是用在判断一个传感器数据的 这个传感器的数据一般是1,只是也会产生很短时间(1-2秒)的数据0,所以我想加一段判断语句,意图是想忽略掉短时间的数据0,就是5秒内产生数据0没有关系,但是超过5秒长时间的数据0 就需要执行另一代码 不知道 我有没有描述清楚 这样的功能在PLC的程序里我很容易写,可vb里我不知道该怎么写 谢谢大家了
传感器的值是如何传到 VB 中的?传感器的值是外边主动发进来的,还是 VB 周期性检测的?这些因素都会影响的程序如何写。 实际上,重点是实际应用场景及解决方案,与使用的语言关系不大。
笨狗先飞 2017-10-11
  • 打赏
  • 举报
回复
如果程序或者要求不是太复杂的话,简单对付一下就算了。 如果传感器多,或者数据处理要求多的话,那这没这么简单了。 需要设计一个采集任务系统,然后一个数据过滤系统,采集速度是越快越好,然后在数据过滤系统里对采集到的数据加工,然后输出。
lsdouli 2017-10-11
  • 打赏
  • 举报
回复
@楼上: 数据已读出来,显示在text1中,就是不稳定
lsdouli 2017-10-10
  • 打赏
  • 举报
回复
大家好,这个代码是用在判断一个传感器数据的 这个传感器的数据一般是1,只是也会产生很短时间(1-2秒)的数据0,所以我想加一段判断语句,意图是想忽略掉短时间的数据0,就是5秒内产生数据0没有关系,但是超过5秒长时间的数据0 就需要执行另一代码 不知道 我有没有描述清楚 这样的功能在PLC的程序里我很容易写,可vb里我不知道该怎么写 谢谢大家了
赵4老师 2017-10-09
  • 打赏
  • 举报
回复
“大神”只往后退了一百步,要他承认比退五十步的人更怕死,他能放下面子吗…………
舉杯邀明月 2017-10-05
  • 打赏
  • 举报
回复
引用 17 楼 chewinggum 的回复:
[quote=引用 16 楼 Chen8013 的回复:] [quote=引用 15 楼 zhao4zhong1 的回复:] [quote=引用 8 楼 of123 的回复:] 在 TextBox 的 Change 事件中启动 Timer 就可以了。如果 Timer 超时了,就说明 TextBox 中的值持续 5 秒没有变化。 1 在 TextBox 的 Change 事件设置 Timer 时限并启动。 2 在 Timer 的 Timer 事件中设置你所需的标志。
引用 14 楼 Chen8013 的回复:
[quote=引用 7 楼 zhao4zhong1 的回复:] [quote=引用 5 楼 chewinggum 的回复:] [quote=引用 4 楼 zhao4zhong1 的回复:] 如果5秒内的某一微秒内,先变0又变1,神仙也抓不到!
就说神仙抓得到的,第2秒变0,第4秒变1[/quote] 能抓到就能成仙?![/quote] 我认为结合Text控件的Change()事件,应该是可以实现的。 [/quote] 我也承认最正宗,最靠谱的方法应该是用Change事件。 但如果真的一微秒变一次,一秒变一百万次的话,Change事件也会反应不过来的。 除非航空航天系统,但航空航天系统人家也不会用VB6的。 [/quote] 反应不过来? 搞笑……你知道这个“Change事件”是如何触发的吗! 你以为这个“Change”是要屏幕上显示内容发生变化后才会发生??? 另外:如果这个数据真是跟某“采集器”关联,一般也不会有这么高的变化频率。 [/quote] 我也就举了个例子,第二秒变0第四秒变1的情况,这个不需要什么高级牛逼神奇未来科技,手工慢悠悠操作就能做到。对于这个手工就能做到的事情,你的代码判断不到,简单的承认一下自己没考虑这个情况不就得了。被人发现不完善的地方,就举各种极端情况来说事。[/quote] 他经常以“大神”自居的,要他承认这个,他能放下面子吗…………
6742 2017-10-03
  • 打赏
  • 举报
回复
前边多写了 Text1.Text = "1" And 呵呵
6742 2017-10-03
  • 打赏
  • 举报
回复

'模块
Option Explicit
    '
Public Declare Function timeSetEvent Lib "winmm.dll" (ByVal uDelay As Long, ByVal uResolution As Long, ByVal lpFunction As Long, ByVal dwUser As Long, ByVal uFlags As Long) As Long
Public Declare Function timeKillEvent Lib "winmm.dll" (ByVal uID As Long) As Long
  
Public lmmCount    As Double
Public lTimeID     As Long '定义用于接收函数返回值的变量

Sub TimeProc(ByVal uID As Long, ByVal uMsg As Long, ByVal dwUser As Long, ByVal dw1 As Long, ByVal dw2 As Long)  'timeSetEvent的回调函数
lmmCount = lmmCount + 0.01
Form1.Caption = lmmCount
End Sub

Sub BeginCount() '开始
lTimeID = timeSetEvent(10, 0, AddressOf TimeProc, 1, 1)   '定义用于接收函数返回值的变量
End Sub

Sub EndCount() '停止
timeKillEvent lTimeID
End Sub
‘ 窗口:



Private Sub Command1_Click()
Text1.Text = "1"
BeginCount

End Sub

Private Sub Text1_Change()
Dim S As Integer

If Text1.Text = "1" And lmmCount > 5 Then S = 9 Else S = 0
Debug.Print S
EndCount
End Sub
脆皮大雪糕 2017-10-02
  • 打赏
  • 举报
回复
引用 16 楼 Chen8013 的回复:
[quote=引用 15 楼 zhao4zhong1 的回复:] [quote=引用 8 楼 of123 的回复:] 在 TextBox 的 Change 事件中启动 Timer 就可以了。如果 Timer 超时了,就说明 TextBox 中的值持续 5 秒没有变化。 1 在 TextBox 的 Change 事件设置 Timer 时限并启动。 2 在 Timer 的 Timer 事件中设置你所需的标志。
引用 14 楼 Chen8013 的回复:
[quote=引用 7 楼 zhao4zhong1 的回复:] [quote=引用 5 楼 chewinggum 的回复:] [quote=引用 4 楼 zhao4zhong1 的回复:] 如果5秒内的某一微秒内,先变0又变1,神仙也抓不到!
就说神仙抓得到的,第2秒变0,第4秒变1[/quote] 能抓到就能成仙?![/quote] 我认为结合Text控件的Change()事件,应该是可以实现的。 [/quote] 我也承认最正宗,最靠谱的方法应该是用Change事件。 但如果真的一微秒变一次,一秒变一百万次的话,Change事件也会反应不过来的。 除非航空航天系统,但航空航天系统人家也不会用VB6的。 [/quote] 反应不过来? 搞笑……你知道这个“Change事件”是如何触发的吗! 你以为这个“Change”是要屏幕上显示内容发生变化后才会发生??? 另外:如果这个数据真是跟某“采集器”关联,一般也不会有这么高的变化频率。 [/quote] 我也就举了个例子,第二秒变0第四秒变1的情况,这个不需要什么高级牛逼神奇未来科技,手工慢悠悠操作就能做到。对于这个手工就能做到的事情,你的代码判断不到,简单的承认一下自己没考虑这个情况不就得了。被人发现不完善的地方,就举各种极端情况来说事。
舉杯邀明月 2017-09-30
  • 打赏
  • 举报
回复
引用 7 楼 zhao4zhong1 的回复:
[quote=引用 5 楼 chewinggum 的回复:] [quote=引用 4 楼 zhao4zhong1 的回复:] 如果5秒内的某一微秒内,先变0又变1,神仙也抓不到!
就说神仙抓得到的,第2秒变0,第4秒变1[/quote] 能抓到就能成仙?![/quote] 我认为结合Text控件的Change()事件,应该是可以实现的。
of123 2017-09-30
  • 打赏
  • 举报
回复
Private Sub Text1_Change()
    Timer1.Enabled = False
    Timer1.Interval = 5000
    Timer1.Enabled = True
End Sub

Private Sub Timer1_Timer()
    Timer1.Enabled = False
    If Text1.Text = "1" Then MsgBox "s = 9"
End Sub
赵4老师 2017-09-30
  • 打赏
  • 举报
回复
不过如果能使用CPU内部自带的数据断点功能,还真能成仙! 数据断点参考:
#include <time.h>
#include <stdlib.h>
#include <windows.h>
int main() {
    int a,b[11];//本来是b[10],为判断哪句越界,故意声明为b[11]

    srand((unsigned int)time(NULL));//按两次F11,等黄色右箭头指向本行时,调试、新建断点、新建数据断点,地址:&b[10],字节计数:4,确定。
    while (1) {//按F5,会停在下面某句,此时a的值为10,b[10]已经被修改为对应0..4之一。
        b[(a=rand()%11)]=0;
        Sleep(100);
        b[(a=rand()%11)]=1;
        Sleep(100);
        b[(a=rand()%11)]=2;
        Sleep(100);
        b[(a=rand()%11)]=3;
        Sleep(100);
        b[(a=rand()%11)]=4;
        Sleep(100);
    }
    return 0;
}
赵4老师 2017-09-30
  • 打赏
  • 举报
回复
引用 9 楼 qq574221329 的回复:
既然会重新赋值,怎么会不知道变量改变了没有?不知道实际需求在哪
人家没准是硬件传感器采集的数据捏。
小噤 2017-09-30
  • 打赏
  • 举报
回复
既然会重新赋值,怎么会不知道变量改变了没有?不知道实际需求在哪
of123 2017-09-30
  • 打赏
  • 举报
回复
在 TextBox 的 Change 事件中启动 Timer 就可以了。如果 Timer 超时了,就说明 TextBox 中的值持续 5 秒没有变化。 1 在 TextBox 的 Change 事件设置 Timer 时限并启动。 2 在 Timer 的 Timer 事件中设置你所需的标志。
赵4老师 2017-09-30
  • 打赏
  • 举报
回复
引用 5 楼 chewinggum 的回复:
[quote=引用 4 楼 zhao4zhong1 的回复:] 如果5秒内的某一微秒内,先变0又变1,神仙也抓不到!
就说神仙抓得到的,第2秒变0,第4秒变1[/quote] 能抓到就能成仙?!
nanfei01055 2017-09-30
  • 打赏
  • 举报
回复
dim startTime as single startTime = timer Do While True Doevents if Timer - StartTime > 5 then exit do end if if text1.text =0 then s = 0 end if Loop 未经调试,但这样一定可以实现
脆皮大雪糕 2017-09-30
  • 打赏
  • 举报
回复
引用 4 楼 zhao4zhong1 的回复:
如果5秒内的某一微秒内,先变0又变1,神仙也抓不到!
就说神仙抓得到的,第2秒变0,第4秒变1
赵4老师 2017-09-30
  • 打赏
  • 举报
回复
如果5秒内的某一微秒内,先变0又变1,神仙也抓不到!
加载更多回复(5)

7,762

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧