Attribute VB_Name = "modEnet"
Option Explicit

Declare Function GetTickCount Lib "kernel32" () As Long
Public Tx() As Byte
Public gmlCurTime As Long
Public gmlMinTime As Long
Public gmlMaxTime As Long

Public Sub InitHeader()

    ReDim Tx(19) As Byte

    Tx(0) = CByte(Asc("L"))
    Tx(1) = CByte(Asc("G"))
    Tx(2) = CByte(Asc("I"))
    Tx(3) = CByte(Asc("S"))
    Tx(4) = CByte(Asc("-"))
    Tx(5) = CByte(Asc("G"))
    Tx(6) = CByte(Asc("L"))
    Tx(7) = CByte(Asc("O"))
    Tx(8) = CByte(Asc("F"))
    Tx(9) = CByte(Asc("A"))
    
    Tx(13) = &H33
    
    Tx(14) = 0                          'Invoke ID
    Tx(15) = 0
    
End Sub

Public Function ByteCheckSum(Buff() As Byte, iStart As Integer, iEnd As Integer) As Byte
    
    Dim i As Integer
    Dim CheckSum As Integer
    
    For i = iStart To iEnd
        CheckSum = CheckSum + Buff(i)
        If CheckSum > 255 Then CheckSum = CheckSum - 256
    Next
    
    ByteCheckSum = CByte(CheckSum)
    
End Function

Public Sub ReadVariable(strVar As String, iDataType As Integer)

    Dim Length As Integer, i As Integer
       
    Length = Len(strVar)
    
    If Not Length > 0 Then _
        Exit Sub
    
    ReDim Preserve Tx(30 + Length - 1)
    
    Tx(16) = CByte(10 + Length)         'Length (2)
    
    Tx(19) = ByteCheckSum(Tx, 0, 18)
   
    Tx(20) = &H54                       'Command (2)
    Tx(21) = 0
    
    Tx(22) = CByte(iDataType)           'DataType (2)
    Tx(23) = 0
    Tx(24) = 0                          'LinkID (2)
    Tx(25) = 0
    Tx(26) = 1                          'Variable Number (2)
    Tx(27) = 0
    
    Tx(28) = CByte(Length)
    Tx(29) = 0
 
    For i = 0 To Length - 1
        Tx(30 + i) = CByte(Asc(Mid(strVar, i + 1, 1)))
    Next
    
    frmClient.tcpClient.SendData Tx
    
    gmlCurTime = GetTickCount

End Sub

Public Sub StatusRequest()

    ReDim Preserve Tx(26 - 1)
    
    Tx(16) = 6                          'Length (2)
    
    Tx(19) = ByteCheckSum(Tx, 0, 18)
   
    Tx(20) = &HB0                       'Command (2)
    Tx(21) = 0
    Tx(22) = 0                          'Reserved (2)
    Tx(23) = 0
    Tx(24) = 0                          'LinkID (2)
    Tx(25) = 0
 
    frmClient.tcpClient.SendData Tx
    
    gmlCurTime = GetTickCount

End Sub

Public Function GetDataType(strVar As String) As Integer
    Dim strType As String
    
    strType = Mid(strVar, 3, 1)
    
    Select Case strType
        Case "B"
            GetDataType = 1
        Case "W"
            GetDataType = 2
        Case "D"
            GetDataType = 3
        Case "L"
            GetDataType = 4
    End Select
End Function

Public Function GetDataSize(iDataType As Integer) As Integer

    Select Case iDataType
        Case 1
           GetDataSize = 1
        Case 2
           GetDataSize = 2
        Case 3
           GetDataSize = 4
        Case 4
           GetDataSize = 8
    End Select

End Function

Public Function GetValStr(Buff() As Byte, iStart As Integer, iDataSize As Integer) As String
    
    Dim strVal As String
    Dim strByteVal As String
    Dim i As Integer
    
    For i = 0 To iDataSize - 1
        strByteVal = Hex$(Buff(i + iStart))
        If Len(strByteVal) = 1 Then strByteVal = "0" + strByteVal
        strVal = strByteVal + strVal
    Next
    
    GetValStr = strVal

End Function

Public Sub WriteVariable(strVar As String, strValue As String, iDataType As Integer)

    Dim iVarLength As Integer, i As Integer, iDataSize As Integer
    Dim iInDataLen As Integer
    Dim iInDataByte As Integer
    Dim iRemLen
    Dim strHexa As String, strRem As String
    Dim byTemp As Byte
    
               
    iVarLength = Len(strVar)
    iDataSize = GetDataSize(iDataType)
    iInDataLen = Len(strValue)
    iInDataByte = (iInDataLen + 1) \ 2
    
    If Not iVarLength > 0 Then _
        Exit Sub
    
    If Not iInDataByte > 0 Then _
        Exit Sub
    
    If iInDataByte > iDataSize Then
        MsgBox "입력한 데이타 길이가 최대값을 초과하였습니다.", vbCritical + vbOKOnly
        Exit Sub
    End If
    
    ReDim Preserve Tx(32 + iVarLength + iDataSize - 1)
    
    Tx(16) = CByte(12 + iVarLength + iDataSize)     'Length (2)
    
    Tx(19) = ByteCheckSum(Tx, 0, 18)
   
    Tx(20) = &H58                       '0x58 (2)
    Tx(21) = 0
    
    Tx(22) = CByte(iDataType)           'DataType (2)
    Tx(23) = 0
    Tx(24) = 0                          'LinkID (2)
    Tx(25) = 0
    Tx(26) = 1                          'Variable Number (2)
    Tx(27) = 0
    
    Tx(28) = CByte(iVarLength)
    Tx(29) = 0
 
    For i = 0 To iVarLength - 1
        Tx(30 + i) = CByte(Asc(Mid(strVar, i + 1, 1)))
    Next
    
    Tx(30 + iVarLength) = CByte(iDataSize)
    Tx(31 + iVarLength) = 0
    
    iRemLen = iInDataLen
    strRem = strValue
    
    i = 0
    
    Do While iRemLen > 0
        strHexa = Right(strRem, 2)
        Tx(32 + iVarLength + i) = CByte("&H" + strHexa)
        i = i + 1
        iRemLen = iRemLen - Len(strHexa)
        If iRemLen > 0 Then strRem = Left(strRem, iRemLen)
    Loop
    
    For i = i To iDataSize - 1
        Tx(32 + iVarLength + i) = 0
    Next
    
    frmClient.tcpClient.SendData Tx
    
    gmlCurTime = GetTickCount

End Sub

Public Sub ErrorMessage(iMsgNo)

    Dim ErrMsg(4) As String
    Dim strErr As String
    
    Select Case iMsgNo
        Case &H21
            strErr = "지정된 변수가 엑세스 경로에 정의되어있지 않습니다."
        Case &H22
            strErr = "Struct 오류 또는 Out or Range 오류가 발생하였습니다."
        Case &H24
            strErr = "데이타 TYPE 오류가 발생하였습니다."
        Case &H71
            strErr = "데이타 길이가 최대값을 초과하였습니다."
        Case &H73
            strErr = "엑세스 제어권 오류가 발생하였습니다."
        Case Else
            strErr = "오류가 발생하였습니다. 오류번호:" + CStr(iMsgNo)
      
    End Select
        
    MsgBox strErr, vbOKOnly + vbCritical, "오류"

End Sub
