VB.net 研华IO卡1762的编程方法 控件方法 VS2010专业版

VB.NET中使用IO卡

IO卡接端子板,在程序中可以用来提供触发信号,端子板接传感器或者接动作开关之后就可以检测到输入和提供输出了。

IO卡使用的是研华PCI-1762十六位输入输出的IO ,先在windows中安装IO卡的驱动程序和客户端,这样就可以手动控制IO卡了,系统中安装了IO卡提供的集成环境之后,VB.NET中就可以引用IO卡提供的DLL了


这是第一步,

在引用中添加控件DLL

第二步就是引用到程序空间一句话:Imports Automation.BDaq

到了这里就可以在程序中使用IO提供的函数和方法了,采用代码加载的方式,我采用控件的方式,所以还要继续

第三步:加载控件



在控件界面,工具——>新建选项卡——>选择项——>NET Framework组件(一定不要选COM组件,我被坑过)——>浏览,找到刚刚引用的DLL 点击确定,在如图我们新建的IO中就有一堆控件了,里面我们需要用到的是InstantDiCtrl和InStantDoCtrl,添加到窗口


第四步:在两个控件中选择IO卡,如图标红,SelectedDevice中显示的是No device ,这是因为我的笔记本没有安装IO卡,如果安装会有可以选择的项,这边只有简单选择一些就可以了。然后就可以代码编程了


第五步:代码编程,一个定时器控件用来轮询IO卡的输入值,定时器控件默认不开启,需要控制开启。

Imports Automation.BDaq

Public Class Form1
#Region "IO定义"
    Public Const NUM_BITIN As Integer = 16
    Public b(NUM_BITIN) As Boolean  '定义一个数组存放IO读取到的结果
    Public mpbof(8) As Boolean '定义控件组大小
    Public card_output As Short
    Public giOutput As Integer
    Public gIOCard As Integer
    Public Di_Data As Long '输入信号
    Public Do_Data As Long '输出信号
    Dim SleepIO As Integer

    Public mpbo() As PictureBox
    Public mpbi() As PictureBox
    Private Const m_startPort As Integer = 0
    Private Const m_portCountShow As Integer = 4
#End Region
    Private Sub InstantDiCtrl1_ChangeOfState(ByVal sender As Object, ByVal e As Automation.BDaq.DiSnapEventArgs) Handles InstantDiCtrl1.ChangeOfState
        MsgBox("触发1")
    End Sub
    Private Sub InstantDiCtrl1_DiIntChanX(ByVal src As Object, ByVal args As DiSnapEventArgs) Handles InstantDiCtrl1.Interrupt
            Try
                MsgBox("IOka ")
                'If args.SrcNum = 0 Then '判断触发端口和是否处于OK状态
                '    SetOut2(5, 1)
                '    Thread.Sleep(500)
                '    GrabImage(1)
                '    SetOut2(5, 0)
                '    If b(10) = True Then
                '        RunImage(1)
                '    ElseIf b(11) = True Then
                '        RunImage2(2)
                '    End If

                'ElseIf args.SrcNum = 8 Then


                'End If

            Catch ex As System.Exception
            End Try
    End Sub
    Private Sub IOINstall()

        If Not InstantDoCtrl1.Initialized Then
            MessageBox.Show("Please select a device in control property!", "StaticDO")
            Me.Close()
            Return
        End If
        If Not InstantDiCtrl1.Initialized Then
            MessageBox.Show("Please select a device in control property!", "StaticDO")
            Me.Close()
            Return
        End If
        '复位输出端口

        InstantDiCtrl1.DiintChannels(0).Enabled = True

        InstantDiCtrl1.DiintChannels(1).Enabled = True
        Dim err As ErrorCode = ErrorCode.Success
        err = InstantDiCtrl1.SnapStart() '开启中断
        If err <> ErrorCode.Success Then
            HandleError(err)
            Return
        End If
    End Sub

    Private Sub HandleError(ByVal err As ErrorCode)
        If err <> ErrorCode.Success Then
            MessageBox.Show("Sorry ! Some errors happened, the error code is: " & err.ToString(), "StaticDI")
        End If
    End Sub

    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        IOINstall()
        Label1.Text = "90"
    End Sub
    Public Sub IoRead()
        InstantDiCtrl1.Read(0, Di_Data)
        Dim index As Integer
        For index = 1 To 8 '获取16个IO口的结果
            If CBool(Di_Data And (1 << (index - 1))) Then '如果有信号输入则为true没有者为false
                b(index) = True '将对应的b数组置为true
            Else
                b(index) = False '将对应的b数组置为false
            End If
        Next
        InstantDiCtrl1.Read(1, Di_Data)
        For index = 1 To 8 '获取16个IO口的结果
            If CBool(Di_Data And (1 << (index - 1))) Then '如果有信号输入则为true没有者为false
                b(index + 8) = True '将对应的b数组置为true
            Else
                b(index + 8) = False '将对应的b数组置为false
            End If
        Next


    End Sub
    Public Sub SetOut2(ByRef mbBit As Short, ByRef mbValue As Byte)
        card_output = mbBit
        SetOut(mbBit, mbValue) '调用取位模块
        ' InstantDoCtrl1.Write()方法,根据端口和位来输出结果,1762是16位IO卡,端口有0和1两个,每个端口八位,两个字节
        '输入的数据转换为十六进制值对应到每一位,获取输入时同样的道理
        InstantDoCtrl1.Write(gIOCard, giOutput) '写出结果
    End Sub
    Private Sub SetOut(ByRef mbBit As Short, ByRef mbValue As Byte)
        If mbBit = 0 Or mbBit > 16 Then  'Error’判断值是否在范围内
            Exit Sub '退出循环
            MessageBox.Show("请检查输出端口是否正确") '报错
        End If

        Dim x As Boolean '设置一个标志
        If mbValue = 1 Then '判断是否为1
            x = True '将x值为true
        Else   '否则
            x = False '将X值为false
        End If

        Dim i As Short
        i = mbBit
        mpbof(i - 1) = Not mpbof(i - 1)
        If mbBit <= 8 Then
            gIOCard = 0
        Else
            gIOCard = 1
            mbBit = mbBit - 8
            i = mbBit
        End If
        If x = False Then
            mpbof(i) = False
        Else
            mpbof(i) = True
        End If
        Dim b As Byte '定义一个byteb当x=false的时候反转
        If x = True Then
            For i = 1 To 8
                If mpbof(i) Then
                    giOutput = giOutput Or (1 << (mbBit - 1))
                End If
            Next
        Else
            b = 0   '将b赋值
            b = b Or (1 << (mbBit - 1)) '移位获取b值
            b = Not b '将b值反转
            giOutput = giOutput And b '将指定端口关闭
        End If
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        SetOut2(1, 1)
    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        SetOut2(1, 0)
    End Sub

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        Try
            IoRead()
            Label1.Text = "90"
            IoRead()
            If b(2) = False Then
                Label1.Text = "0"
            Else
                Label1.Text = "1"
            End If
        Catch ex As Exception
            MsgBox(ex.Message & "错误")
        End Try
    End Sub

    Private Sub Label1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Label1.Click

    End Sub
End Class


原理:很多代码是为了变换数值和数制。输入和输出主要通过两行代码:   InstantDiCtrl1.Read(0, Di_Data)读取端口和 InstantDoCtrl1.Write(0, giOutput) '写出结果,先说读取,read(第一个参数,第二个参数),其中第一个参数是IO卡的端口,可以在IO卡提供的客户端中看到,如图



第一个参数对应port,在研华1762中只能取1或者0 第二个参数则对应hex是十六进制值,也就是说,我们给的第二个参数的值,控件自动解析成hex,如果读取到32,那么则是

D5为高电平,如果是33,则是D5和D0都是高电平。我们读取到的是十进制数,要把它解析成十六进制才能找到对应的端口。输出也是一样道理write(第一个参数,第二个参数),第二个参数也是十六进制,如果我们想让0端口的0和6为高电平(低电平为默认)那么第一个参数是0,第二个参数是32(6)加1(0)33,也就是除了这两个位,别的位都为0,这样就会更新端口的状态,达到控制输出的目的。

PS:我都资源中有Demo 感谢雷哥和文哥

  • 5
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
研华运动控制PCI-1285-AE说明书 特点 PCI-1245E PCI-1285E PCI-1245E PCI-1285E 四/八轴PCI接口DSP架构经济版 脉冲型运动控制 规格 脉冲型运动控制 ƒƒ电机驱动支持 脉冲型伺服/步进电机 ƒƒ轴数 PCI-1245E: 4 PCI-1285E: 8 ƒƒ插补 2轴直线插补 ƒƒ最大输出速度 5 Mpps ƒƒ步进计数范围 ±2, 147, 483, 646 ƒƒ脉冲输出类型 脉冲/方向 (1-脉冲, 1-方向) CW/CCW (2-脉冲) ƒƒ位置计数 指令/实际 位置范围 ƒƒ速度形式 T-曲线, S-曲线 I/O ƒƒ机械接口 LMT+、LMT-、ORG/轴 ƒƒ伺服驱动接口 ALM、INP ƒƒ通用I/O PCI-1245E 16DI/16DO PCI-1285E 32DI/32DO (RDY/LTC引脚转换为通用输入引脚, CAM-DO/CMP/SVON/ERC引脚转换为通用输出 引脚) 编码器接口 ƒƒ输入类型 正交 (A/B相,加/减) ƒƒ每个编码器循环计数 x1, x2, x4 (仅A/B相) ƒƒ输入范围 5 ~ 10 V ƒƒ隔离保护 2,500 VDC ƒƒ最大输入频率 4xAB模式下10 MHz 一般 ƒƒ总线类型 通用 PCI V2.2 ƒƒ连接器 PCI-1245E: 1 x 100-pin SCSI 母头连接器 PCI-1285E: 2 x 100-pin mini-SCSI 母头连接器 ƒƒ尺寸 (L x H) 175 x 100 mm (6.9" x 3.9") ƒƒ编码器输入规格为4xAB模式10 MHz, CW/CCW 模式2.5 MHz ƒƒ脉冲输出高达5 M pps/轴 ƒƒ DSP中可以规划10K的轨迹内存缓冲区 ƒƒ支持电子齿轮运动 ƒƒ支持两轴直线插补运动 ƒƒ输出方式可通过跳线设置为差分或单端输入方式 ƒƒ 16种回HOME模式 ƒƒ可编程中断 ƒƒ硬件紧急输入

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值