I'm looking for the serial Faro Arm software development kit in hopes that I can create a plugin for one of the other CAD packages that I'm proficient with. Since Faro no longer supports the serial Faro Arm they have refused my requests for the SDK.
A small example on VBA for Excel.
mscomm32.ocx is used.
Maybe it will be useful to you.
Option Explicit
Dim CommPort As New MSComm, bStop As Boolean
Private Sub CommandButton1_Click()
bStop = False
Call StartGetting
End Sub
' Метод открывает RS-232 порт (если он еще не открыт)
' PortNumber - Номер COM порта (COM1 = 1, COM2 = 2, ... )
Sub CommOpen(PortNumber As Integer)
If Not CommPort.PortOpen = True Then
CommPort.CommPort = PortNumber
CommPort.Settings = "38400,N,8,1"
CommPort.Handshaking = comNone
CommPort.InBufferSize = 1024
CommPort.OutBufferSize = 0
CommPort.PortOpen = True
CommPort.RThreshold = 0
End If
End Sub
' Метод закрывает RS-232 порт (если он был открыт)
Sub CommClose()
If CommPort.PortOpen = True Then
CommPort.PortOpen = False
End If
End Sub
Sub StartGetting()
Dim InpStr$, SerialNumber 'As String
Dim dummy%, BufCount%, i%, iRow%, iPos%, iVal% 'As Integer
Dim Bytes() As Byte
'=========================
'Формируем команду $KE,WR
On Error Resume Next
Dim B() As Byte
'CMD = "5f 49" 'информация о порте
'Const CMD = "5f 47" 'информация об устройстве
'CMD = 5f 44 31 5f 47 '
'CMD = "5f 46" 'координаты
Dim CMD
Dim aCMD$()
Dim data As String
' Отсылка команды устройству
'Чтние строки с ожиданием символа 0x0D в конце
CommOpen (Range("ComPortNum"))
'Запрашиваем информацию
CMD = "5f 47" 'информация об устройстве
Str2Bin (CMD) 'Отсылка запроса устройству
'CommPort.Output = B
Application.Wait (Now + TimeValue("0:00:1"))
CommPort.InputLen = 1 ' читаем последовательно по байту
CommPort.InputMode = comInputModeText ' работаем со строкой
Do ' ищем начало пакета
dummy = DoEvents() ' не вешаем систему
InpStr = InpStr + CommPort.Input
iPos% = InStr(InpStr, "Industrial Metrecom Serial Comm Version: 7.61 serial NO:") ' индификатор девайса
Loop Until iPos% > 0 ' пока не прочтём Industrial Metrecom Serial Comm Version: 7.61 serial NO:
Application.Wait (Now + TimeValue("0:00:1")) 'ждём секунду, чтобы заполнить буфер
CommPort.InputLen = 258 ' к этому моменту у нас прочитана только сигнатура
InpStr = CommPort.Input ' дочитали остаток строки 258 байт
CommPort.InputLen = 262 ' дальше читаем полными пакетами
SerialNumber = Split(InpStr, " ") 'Ищим серийный номер КИМ
'MsgBox SerialNumber(1) 'Выводим серийный номер КИМ
Range("A3") = SerialNumber(1)
'CommPort.InputMode = comInputModeBinary
CommPort.InputLen = 256 ' читаем последовательно по байту
CommPort.InputMode = comInputModeText ' работаем со строкой
'CMD = "5f 46" 'координаты
'Str2Bin (CMD)
Do
dummy = DoEvents() ' не вешаем систему
Application.Wait (Now + TimeValue("0:00:01") / 1000 * 650)
BufCount = CommPort.InBufferCount
CMD = "5f 46" 'координаты
Str2Bin (CMD)
If BufCount >= 96 Then
If CommPort.SThreshold = False Then Range("G3").Value = "FALSE"
If CommPort.SThreshold = True Then Range("G3").Value = "TRUE"
'Bytes = CommPort.Input
'If Bytes(0) = 84 And Bytes(1) = 65 And Bytes(2) = 79 And Bytes(3) = 83 Then ' проверяем сигнатуру на всякий случай ещё раз
'Range("Diapazon").Value = Bytes(4) ' выводим диапазон
'For i = LBound(Bytes) + 5 To UBound(Bytes) - 1 Step 2
'iRow = (i - 5) / 2
'iVal = Bytes(i) * 256 + Bytes(i + 1) ' собираем из исходных 256 байт - 128
'Range("OutPlace").Offset(iRow, 0) = iVal ' в принципе можно сначала сформировать массив и вывести его сразу весь, проверяя CRC
'Next i
'End If
InpStr = CommPort.Input
SerialNumber = Split(InpStr, " ")
Range("I3").Value = SerialNumber(1) ' выводим диапазон
Range("I4").Value = SerialNumber(2) ' выводим диапазон
Range("I5").Value = SerialNumber(3) ' выводим диапазон
'MsgBox SerialNumber(1)
End If
Loop Until (bStop = True)
Call CommClose
End Sub
Private Sub CommandButton2_Click()
bStop = True
End Sub
Function Str2Bin(CMD As String) As String
Dim aCMD$()
'Dim CMD
Dim i
aCMD = Split(CMD)
ReDim B(0 To UBound(aCMD)) As Byte
For i = 0 To UBound(B)
B(i) = "&h" & aCMD(i)
Next
CommPort.Output = B
End Function