【工控】两个字简单的来说不外乎就是接点 0/1开关状态检测 ,接收仪表设备数据, 定时或定量检测当前数据是否超标, 适时的响应设备开关或暂停或转向的动作.
本帖所探讨的就是接点检测 一般的I/O板卡, 返回方式基本上大半都是以十进制数值返回, 因此在学习VB6的过程中,我们就必须了解二进制与十进制之间的转换关系, 例如下图: 8个接点 每个接点都标识着数字,代表8位的01顺序数值, 1 以红色球表示 0 以绿色球表示, 以本例来说 1 2 3 5 8 有5个接点是导通运行中
加总个别数值 1+2+4+16+128 = 151 所以当我们接收到151数值后,经过拆解便可知道那个接点是导通或断开。

'这个代码用在工控I/O接点检测 判定某个接点为 0(关闭状态) 或 1(打开状态)
'十进制与二进制的转换
'添加 Text1 Command1 Command2 Command3 Label1 Shape1(0)
'128,64,32,16,8,4,2,1 (从右边往左算是1-128 连乘2 合计 255)
'可以理解为2的7次方 7次方 6次方 5次方。。。。。0次方
Option Explicit
Private WithEvents Timer1 As Timer
Dim i&, j&, aa$ '变量定义与型态声明
Private Sub Form_Load()
Command1.Caption = "10转2"
Command2.Caption = "2转10"
Command3.Caption = "随机灯号"
Command1.Enabled = True
Command2.Enabled = False
Text1.Text = "151" '比方说I/O板卡返回 151 转为二进制得到 10010111
'******************************
For i = 1 To 7 '循环线上添加 7个 Shape数组 形状控件 与原先的1个 共有8个
Load Shape1(i) '装载控件 索引编号为i
Shape1(i).Visible = True '线上添加的控件默认为不可见 我们得将它设为 可见
Shape1(i).Left = Shape1(i - 1).Left + Shape1(0).Width + 70 '定位新添加的控件,在前一个控件的位置加上宽度再加上间距70
Next i
'*******************************
Me.Move (Screen.Width - Me.Width) \ 2, (Screen.Height - Me.Height) \ 2 '窗体定位于屏幕中心
Command1_Click '自动点击按钮1 将十进制的151转为二进制
Set Timer1 = Controls.Add("vb.Timer", "Timer1") '线上添加 Timer1 定时器控件
Timer1.Interval = 3000: Timer1.Enabled = False '定时器Timer1的激发间隔设为3000毫秒 暂时禁用
Me.Caption = "工控第一课 研华PCI-1761 I/O 板卡"
Label1.Caption = "151"
End Sub
Private Sub Command1_Click() '十进制转二进制
If Command3.Caption = "停止演示" Then Command3_Click '如果随机演示正在进行中 我们先自动点击按钮3 让它停止演示
'Text1.Text是文字形态 我们必须先使用Val函数将它转为数值
'调用 Ten2Two 副程序将Text1.Text转换过的数值 转换为文字型态的二进制 再赋值给 Text1.Text
Text1.Text = Format(Ten2Two(Val(Text1.Text)), "00000000")
For i = 1 To Len(Text1.Text) '从1开始循环到Text1长度
'如果Shape1数组i-1的值为0 Shape1的颜色显示绿色 否则显示红色
Shape1(i - 1).FillColor = IIf(Mid(Text1.Text, i, 1) = 0, QBColor(10), QBColor(12))
Next i
Command1.Enabled = Not Command1.Enabled 'Not的使用技术原理是反向 假变成真 真变成假
Command2.Enabled = Not Command2.Enabled '让两个按钮反向为 可用或不可用
End Sub
Private Sub Command2_Click() '二进制转十进制
If Command3.Caption = "停止演示" Then Command3_Click '如果随机演示正在进行中 我们先自动点击按钮3 让它停止演示
'调用副程序Two2Ten 将Text1文本框内的二进制内容转换返回数值
'再使用 Cstr函数将此数值转换为文字型态 再用 Trim函数将此文字型内容左右两边可能的空白字符去掉
Text1.Text = Trim(CStr(Two2Ten(Text1.Text)))
Command1.Enabled = Not Command1.Enabled '让两个按钮反向为 可用或不可用
Command2.Enabled = Not Command2.Enabled
End Sub
Private Sub Command3_Click() '随机演示数值转换并显示相应的灯号
Command3.Caption = IIf(Command3.Caption = "随机灯号", "停止演示", "随机灯号")
Timer1.Enabled = Not Timer1.Enabled '定时器反向 开始或停止演示
End Sub
Function Ten2Two(ByVal Tvalue As Long) As String '十进制转二进制
If Tvalue = 0 Then Ten2Two = "00000000": Exit Function
aa = ""
Do Until Tvalue < 1 '循环直到变量Tvalue的值小于 1 才结束循环
aa = CStr(Tvalue And 1) & aa '变量aa 逐一累加
Tvalue = Tvalue \ 2 '将变量Tvalue除以2 将此数值去除小数 整数化
Loop
Ten2Two = aa '将文字变量aa返回
End Function
Function Two2Ten(ByVal Tstr As String) As Long '二进制转十进制
Dim TmpVal& '定义数值型变量 TmpVal
j = Len(Trim(Tstr)) '将参数Tstr去除空白后计算它的长度(几个字符) 赋值给 j
For i = 1 To j '从第一个字符开始循环到j个字符
'变量开始逐一累加i的?次方
TmpVal = IIf(Val(Mid(Tstr, j - (i - 1), 1)) > 0, TmpVal + 2 ^ (i - 1), TmpVal)
Next i
Two2Ten = TmpVal '将数值变量TmpVal返回
End Function
Private Sub Timer1_Timer() '定时器的事件
Dim RndVal& '变量定义
Timer1.Enabled = False '换算过程前暂时先让定时器停止运行
Randomize '随机数种子初始化
RndVal = Int(Rnd * 256) '0-255共256个数 随机取值
'将取到的随机数调用副程序Ten2Two 将十进制接收值转换为0与1的二进制后 赋值给文字型变量aa
aa = Format(Trim(CStr(Ten2Two(RndVal))), "00000000")
Label1.Caption = CStr(RndVal) '让标签显示接收到(随机数)的十进制值
Text1.Text = aa '文本框Text1显示变量aa的内容
For i = 1 To Len(aa) '从第一个字符开始循环到变量aa包含几个字符
'如果Shape1数组i-1的值为0 Shape1的颜色显示绿色 否则显示红色
Shape1(i - 1).FillColor = IIf(Mid(aa, i, 1) = "0", QBColor(10), QBColor(12))
Next i
Timer1.Enabled = True '换算完成后再让定时器继续运行
End Sub
本帖所探讨的就是接点检测 一般的I/O板卡, 返回方式基本上大半都是以十进制数值返回, 因此在学习VB6的过程中,我们就必须了解二进制与十进制之间的转换关系, 例如下图: 8个接点 每个接点都标识着数字,代表8位的01顺序数值, 1 以红色球表示 0 以绿色球表示, 以本例来说 1 2 3 5 8 有5个接点是导通运行中
加总个别数值 1+2+4+16+128 = 151 所以当我们接收到151数值后,经过拆解便可知道那个接点是导通或断开。

'这个代码用在工控I/O接点检测 判定某个接点为 0(关闭状态) 或 1(打开状态)
'十进制与二进制的转换
'添加 Text1 Command1 Command2 Command3 Label1 Shape1(0)
'128,64,32,16,8,4,2,1 (从右边往左算是1-128 连乘2 合计 255)
'可以理解为2的7次方 7次方 6次方 5次方。。。。。0次方
Option Explicit
Private WithEvents Timer1 As Timer
Dim i&, j&, aa$ '变量定义与型态声明
Private Sub Form_Load()
Command1.Caption = "10转2"
Command2.Caption = "2转10"
Command3.Caption = "随机灯号"
Command1.Enabled = True
Command2.Enabled = False
Text1.Text = "151" '比方说I/O板卡返回 151 转为二进制得到 10010111
'******************************
For i = 1 To 7 '循环线上添加 7个 Shape数组 形状控件 与原先的1个 共有8个
Load Shape1(i) '装载控件 索引编号为i
Shape1(i).Visible = True '线上添加的控件默认为不可见 我们得将它设为 可见
Shape1(i).Left = Shape1(i - 1).Left + Shape1(0).Width + 70 '定位新添加的控件,在前一个控件的位置加上宽度再加上间距70
Next i
'*******************************
Me.Move (Screen.Width - Me.Width) \ 2, (Screen.Height - Me.Height) \ 2 '窗体定位于屏幕中心
Command1_Click '自动点击按钮1 将十进制的151转为二进制
Set Timer1 = Controls.Add("vb.Timer", "Timer1") '线上添加 Timer1 定时器控件
Timer1.Interval = 3000: Timer1.Enabled = False '定时器Timer1的激发间隔设为3000毫秒 暂时禁用
Me.Caption = "工控第一课 研华PCI-1761 I/O 板卡"
Label1.Caption = "151"
End Sub
Private Sub Command1_Click() '十进制转二进制
If Command3.Caption = "停止演示" Then Command3_Click '如果随机演示正在进行中 我们先自动点击按钮3 让它停止演示
'Text1.Text是文字形态 我们必须先使用Val函数将它转为数值
'调用 Ten2Two 副程序将Text1.Text转换过的数值 转换为文字型态的二进制 再赋值给 Text1.Text
Text1.Text = Format(Ten2Two(Val(Text1.Text)), "00000000")
For i = 1 To Len(Text1.Text) '从1开始循环到Text1长度
'如果Shape1数组i-1的值为0 Shape1的颜色显示绿色 否则显示红色
Shape1(i - 1).FillColor = IIf(Mid(Text1.Text, i, 1) = 0, QBColor(10), QBColor(12))
Next i
Command1.Enabled = Not Command1.Enabled 'Not的使用技术原理是反向 假变成真 真变成假
Command2.Enabled = Not Command2.Enabled '让两个按钮反向为 可用或不可用
End Sub
Private Sub Command2_Click() '二进制转十进制
If Command3.Caption = "停止演示" Then Command3_Click '如果随机演示正在进行中 我们先自动点击按钮3 让它停止演示
'调用副程序Two2Ten 将Text1文本框内的二进制内容转换返回数值
'再使用 Cstr函数将此数值转换为文字型态 再用 Trim函数将此文字型内容左右两边可能的空白字符去掉
Text1.Text = Trim(CStr(Two2Ten(Text1.Text)))
Command1.Enabled = Not Command1.Enabled '让两个按钮反向为 可用或不可用
Command2.Enabled = Not Command2.Enabled
End Sub
Private Sub Command3_Click() '随机演示数值转换并显示相应的灯号
Command3.Caption = IIf(Command3.Caption = "随机灯号", "停止演示", "随机灯号")
Timer1.Enabled = Not Timer1.Enabled '定时器反向 开始或停止演示
End Sub
Function Ten2Two(ByVal Tvalue As Long) As String '十进制转二进制
If Tvalue = 0 Then Ten2Two = "00000000": Exit Function
aa = ""
Do Until Tvalue < 1 '循环直到变量Tvalue的值小于 1 才结束循环
aa = CStr(Tvalue And 1) & aa '变量aa 逐一累加
Tvalue = Tvalue \ 2 '将变量Tvalue除以2 将此数值去除小数 整数化
Loop
Ten2Two = aa '将文字变量aa返回
End Function
Function Two2Ten(ByVal Tstr As String) As Long '二进制转十进制
Dim TmpVal& '定义数值型变量 TmpVal
j = Len(Trim(Tstr)) '将参数Tstr去除空白后计算它的长度(几个字符) 赋值给 j
For i = 1 To j '从第一个字符开始循环到j个字符
'变量开始逐一累加i的?次方
TmpVal = IIf(Val(Mid(Tstr, j - (i - 1), 1)) > 0, TmpVal + 2 ^ (i - 1), TmpVal)
Next i
Two2Ten = TmpVal '将数值变量TmpVal返回
End Function
Private Sub Timer1_Timer() '定时器的事件
Dim RndVal& '变量定义
Timer1.Enabled = False '换算过程前暂时先让定时器停止运行
Randomize '随机数种子初始化
RndVal = Int(Rnd * 256) '0-255共256个数 随机取值
'将取到的随机数调用副程序Ten2Two 将十进制接收值转换为0与1的二进制后 赋值给文字型变量aa
aa = Format(Trim(CStr(Ten2Two(RndVal))), "00000000")
Label1.Caption = CStr(RndVal) '让标签显示接收到(随机数)的十进制值
Text1.Text = aa '文本框Text1显示变量aa的内容
For i = 1 To Len(aa) '从第一个字符开始循环到变量aa包含几个字符
'如果Shape1数组i-1的值为0 Shape1的颜色显示绿色 否则显示红色
Shape1(i - 1).FillColor = IIf(Mid(aa, i, 1) = "0", QBColor(10), QBColor(12))
Next i
Timer1.Enabled = True '换算完成后再让定时器继续运行
End Sub