Attribute VB_Name = "modProdave6" Option Explicit ' PRODAVE S7 declarations in Visual Basic ' for S7_300 or S7_200 ' ' Projekt/project -> Eigenschaften/Propertys -> erstellen/build ' S7_300 = 1 or S7_200 = 1 ' ' ' ' '**************************************************************************************************************************** 'declarations for S7-200/300/400 '**************************************************************************************************************************** Type tm tm_hour As Long 'Hours since midnight (0 – 23) tm_isdst As Long 'Positive if daylight saving time is in effect; 0 if daylight saving time is not in effect; negative if status of daylight saving time is unknown. The C run-time library assumes the United States’s rules for implementing the calculation of Daylight Saving Time (DST). tm_mday As Long 'Day of month (1 – 31) tm_min As Long 'Minutes after hour (0 – 59) tm_mon As Long 'Month (0 – 11; January = 0) tm_sec As Long 'Seconds after minute (0 – 59) tm_wday As Long 'Day of week (0 – 6; Sunday = 0) tm_yday As Long 'Day of year (0 – 365; January 1 = 0) tm_year As Long 'Year (current year minus 1900) End Type Type TTIMESTAMP Timestamp(6) As Byte End Type Type CON_ADR_TYPE ' MPI Stationsadresse (2 |0 |0 |0 |0 |0 ) ' IP Adresse (192|168|0 |1 |0 |0 ) ' MAC Adresse (08 |00 |06 |01 |AA |BB ) Adresse(5) As Byte End Type Type CON_TABLE_TYPE Adr As CON_ADR_TYPE ' Verbindungsadresse AdrType As Byte ' Typ der Adresse MPI(1) IP(2) MAC(3) SlotNr As Byte ' Slot-Nummer RackNr As Byte ' Rack-Nummer End Type Type AS_INFO_TYPE Plcas As Long ' TypAusgabestand PLC Pgas As Integer ' TypAusgabestand PGAS mlfb As String * 20 ' MLFB der angeschlossenen AS End Type Type AS200_INFO_TYPE Firmware As Long ASIC As Long mlfb As String * 16 ' MLFB der angeschlossenen AS End Type Type BST_DIAG_TYPE blknr As Integer ' Bausteinnummer Timestamp As tm ' Zeitstempel zu der Bausteinnummer End Type Type DIAG_BUFFER_TYPE EventID As Integer ' EreignisID EventInfo(9) As Byte ' Info zum Ereignis Timestamp(7) As Byte ' Zeitstempel des Ereignises End Type Type BST_STAT_TYPE blkType As Integer ' Bausteintyp BlkNumber As Integer ' Bausteinnummer BlkName As String * 8 ' Bausteinname BlkVersion As Integer ' Bausteinversion BlkLength As Long ' Bausteinlänge BlkTimestamp1 As tm ' Zeitstempel zu der Bausteinnummer BlkTimestamp2 As tm ' Zeitstempel zu der Bausteinnummer blkSecurity(3) As Byte ' Baustein Schutzstufe End Type Type BST_HEADER_TYPE ProgLang As Byte ' Programiersprache blkType As Byte ' Bausteintyp BlkNumber As Integer ' Bausteinnummer Attribute As Byte ' Attribute BlkVersion As Integer ' Bausteinversion BlkLength As Long ' Bausteinlänge Length(3) As Long ' Datenlänge DynLen As Integer ' Länge der dyn. lokal Daten BlkTimestamp1 As tm ' Zeitstempel zu der Bausteinnummer BlkTimestamp2 As tm ' Zeitstempel zu der Bausteinnummer blkSecurity(3) As Byte ' Baustein Schutzstufe ProducerName As String * 8 ' Producer Name BlkFamName As String * 8 ' Baustein Familien Name BlkName As String * 8 ' Bausteinname Version As Integer ' Dies ist eine Anwenderversion und hat nicht mit der Bausteinversion zu tun chckSum As Integer ' Checksumme CPUType As Long ' CPU-Typ signature As Integer 'signature End Type Public Enum EnumProdaveDATATYPE TypeByte = 1 TypeFloat = 2 End Enum '**************************************************************************************************************************** 'variables for demoprogram '**************************************************************************************************************************** Global ErrorText As String Const MAX_BUFFER = 65536 Global ret As Long Global Amount As Long Global BLOCKNO As Long Global no As Long Global UserID(17) As Byte Global MPIAdr As Byte Private Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Long, ByVal lpFileName As String) As Long Private Declare Function WritePrivateProfileString Lib "kernel32" Alias "WritePrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpString As Any, ByVal lpFileName As String) As Long '**************************************************************************************************************************** Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (lpTo As Any, lpFrom As Any, ByVal lLen As Long) '**************************************************************************************************************************** 'declarations for S7-300/400 '**************************************************************************************************************************** Declare Function GetModuleFileNameA Lib "kernel32.dll" (ByVal hModule As Long, szPath As Byte, ByVal szPathLen As Long) As Long Declare Function LoadConnection_ex6 Lib "Prodave6.dll" _ (ByVal ConNr As Integer, ByVal AccessPoint As String, _ ByVal ConTableLen As Integer, pConTable As CON_TABLE_TYPE) As Long Declare Function SetActiveConnection_ex6 Lib "Prodave6.dll" (ByVal ConNr As Integer) As Long Declare Function UnloadConnection_ex6 Lib "Prodave6.dll" (ByVal ConNr As Integer) As Long Declare Function as_info_ex6 Lib "Prodave6.dll" (ByVal BufLen As Long, pInfoBuffer As AS_INFO_TYPE, _ pDatLen As Long) As Long Declare Function as_zustand_ex6 Lib "Prodave6.dll" (pState As Byte) As Long Declare Function db_buch_ex6 Lib "Prodave6.dll" (ByVal BufLen As Long, pBuchBuffer As Byte, pDatLen As Long) As Long Declare Function db_read_ex6 Lib "Prodave6.dll" (ByVal blknr As Integer, ByVal DatType As Byte, _ ByVal StartNr As Integer, Amount As Long, BufLen As Long, _ pBuchBuffer As Byte, pDatLen As Long) As Long Declare Function db_write_ex6 Lib "Prodave6.dll" (ByVal blknr As Integer, ByVal DatType As Byte, _ ByVal StartNr As Integer, Amount As Long, BufLen As Long, _ pWriteBuffer As Byte) As Long Declare Function bst_read_diag_ex6 Lib "Prodave6.dll" (ByVal blkType As Long, ByVal StartNr As Integer, _ Amount As Long, BufLen As Long, _ pDiagBuffer As Byte, pDatLen As Long) As Long Declare Function bst_read_stat_ex6 Lib "Prodave6.dll" (ByVal blkType As Long, ByVal BufLen As Long, _ pStatBuffer As Byte, ByRef pDatLen As Long) As Long Declare Function bst_read_ex6 Lib "Prodave6.dll" (ByVal blkType As Integer, ByVal blknr As Integer, _ ByVal BufLen As Long, pReadBuffer As BST_HEADER_TYPE, _ pDatLen As Long) As Long Declare Function read_diag_buf_ex6 Lib "Prodave6.dll" (ByVal BufLen As Long, pDiagBuffer As Byte, _ pDatLen As Long) As Long Declare Function field_read_ex6 Lib "Prodave6.dll" (ByVal Fieldtype As Byte, ByVal blknr As Integer, _ ByVal StartNr As Integer, ByVal Amount As Long, _ BufLen As Long, pBuffer As Byte, pDatLen As Long) As Long Declare Function field_write_ex6 Lib "Prodave6.dll" (ByVal Fieldtype As Byte, ByVal blknr As Integer, _ ByVal StartNr As Integer, ByVal Amount As Long, _ BufLen As Long, pBuffer As Byte) As Long Declare Function mb_setbit_ex6 Lib "Prodave6.dll" (ByVal MbNr As Integer, ByVal bitNr As Byte, _ ByVal value As Byte) As Long Declare Function mb_bittest_ex6 Lib "Prodave6.dll" (ByVal MbNr As Integer, ByVal bitNr As Byte, _ value As Byte) As Long '**************************************************************************************************************************** 'AS200 Funktionen '**************************************************************************************************************************** Declare Function as200_as_info_ex6 Lib "Prodave6.dll" (ByVal BufLen As Long, pBuffer As AS200_INFO_TYPE, _ pDatLen As Long) As Long Declare Function as200_as_zustand_ex6 Lib "Prodave6.dll" (pState As Byte) As Long Declare Function as200_field_read_ex6 Lib "Prodave6.dll" (ByVal Fieldtype As Byte, ByVal blknr As Integer, _ ByVal StartNr As Integer, Amount As Long, BufLen As Long, _ pBuffer As Byte, pDatLen As Long) As Long Declare Function as200_field_write_ex6 Lib "Prodave6.dll" (ByVal Fieldtype As Byte, ByVal blknr As Integer, _ ByVal StartNr As Integer, Amount As Long, BufLen As Long, _ pBuffer As Byte) As Long Declare Function as200_mb_setbit_ex6 Lib "Prodave6.dll" (ByVal MbNr As Integer, ByVal bitNr As Byte, _ ByVal value As Byte) As Long Declare Function as200_mb_bittest_ex6 Lib "Prodave6.dll" (ByVal MbNr As Integer, ByVal bitNr As Byte, _ value As Byte) As Long '**************************************************************************************************************************** 'Komfort Funktionen '**************************************************************************************************************************** Declare Function GetErrorMessage_ex6 Lib "Prodave6.dll" (ByVal ErrorNr As Long, ByVal BufLen As Long, _ pBuffer As Byte) As Long Declare Function kg_2_float_ex6 Lib "Prodave6.dll" (ByVal kg As Long, pieee As Double) As Long Declare Function float_2_kg_ex6 Lib "Prodave6.dll" (ieee As Double, pkg As Long) As Long Declare Function gp_2_float_ex6 Lib "Prodave6.dll" (ByVal gp As Long, pieee As Double) As Long Declare Function float_2_gp_ex6 Lib "Prodave6.dll" (ieee As Double, pgp As Long) As Long Declare Function testbit_ex6 Lib "Prodave6.dll" (value As Byte, bitNr As Byte) As Integer Declare Function byte_2_bool_ex6 Lib "Prodave6.dll" (ByVal value As Long, pBuffer As Integer) Declare Function bool_2_byte_ex6 Lib "Prodave6.dll" (pBuffer As Integer) As Byte Declare Function kf_2_integer_ex6 Lib "Prodave6.dll" (ByVal wValue As Integer) As Integer Declare Function kf_2_long_ex6 Lib "Prodave6.dll" (ByVal dwValue As Long) As Long Declare Function swab_buffer_ex6 Lib "Prodave6.dll" (pBuffer As Byte, Amount As Long) Declare Function copy_buffer_ex6 Lib "Prodave6.dll" (pTargetBuffer As Byte, pSourceBuffer As Byte, Amount As Long) Declare Function ushort_2_bcd_ex6 Lib "Prodave6.dll" (pwValues As Integer, ByVal Amount As Long, _ ByVal InBytechange As Integer, ByVal OutBytechange As Integer) Declare Function ulong_2_bcd_ex6 Lib "Prodave6.dll" (pdwValues As Long, ByVal Amount As Long, _ ByVal InBytechange As Integer, ByVal OutBytechange As Integer) Declare Function bcd_2_ushort_ex6 Lib "Prodave6.dll" (pwValues As Integer, ByVal Amount As Long, _ ByVal InBytechange As Integer, ByVal OutBytechange As Integer) Declare Function bcd_2_ulong_ex6 Lib "Prodave6.dll" (pdwValues As Long, ByVal Amount As Long, _ ByVal InBytechange As Integer, ByVal OutBytechange As Integer) Declare Function GetLoadedConnections_ex6 Lib "Prodave6.dll" (ByVal BufLen As Long, pBuffer As Integer) '**************************************************************************************************************************** 'Funktions '**************************************************************************************************************************** 'Wandelt ein ByteArray in einen String um Public Function ByteToString(Target As String, byteArray() As Byte, ByVal Amount As Long) As Boolean Dim i As Integer Dim MyChar As String For i = 0 To Amount ' neu RH 21.5.2012: String ist durch Null-Byte terminiert If byteArray(i) = 0 Then Exit For End If MyChar = MyChar & Chr(byteArray(i)) Next Target = MyChar End Function 'Wandelt einen HexString in eine Dezimalzahl um Public Function HexToDec(strHex As String) As Long Select Case (Right(strHex, 1)) Case "0" HexToDec = 0 + (16 * (HexToDec(Left(strHex, Len(strHex) - 1)))) Case "1" HexToDec = 1 + (16 * (HexToDec(Left(strHex, Len(strHex) - 1)))) Case "2" HexToDec = 2 + (16 * (HexToDec(Left(strHex, Len(strHex) - 1)))) Case "3" HexToDec = 3 + (16 * (HexToDec(Left(strHex, Len(strHex) - 1)))) Case "4" HexToDec = 4 + (16 * (HexToDec(Left(strHex, Len(strHex) - 1)))) Case "5" HexToDec = 5 + (16 * (HexToDec(Left(strHex, Len(strHex) - 1)))) Case "6" HexToDec = 6 + (16 * (HexToDec(Left(strHex, Len(strHex) - 1)))) Case "7" HexToDec = 7 + (16 * (HexToDec(Left(strHex, Len(strHex) - 1)))) Case "8" HexToDec = 8 + (16 * (HexToDec(Left(strHex, Len(strHex) - 1)))) Case "9" HexToDec = 9 + (16 * (HexToDec(Left(strHex, Len(strHex) - 1)))) Case "a", "A" HexToDec = 10 + (16 * (HexToDec(Left(strHex, Len(strHex) - 1)))) Case "b", "B" HexToDec = 11 + (16 * (HexToDec(Left(strHex, Len(strHex) - 1)))) Case "c", "C" HexToDec = 12 + (16 * (HexToDec(Left(strHex, Len(strHex) - 1)))) Case "d", "D" HexToDec = 13 + (16 * (HexToDec(Left(strHex, Len(strHex) - 1)))) Case "e", "E" HexToDec = 14 + (16 * (HexToDec(Left(strHex, Len(strHex) - 1)))) Case "f", "F" HexToDec = 15 + (16 * (HexToDec(Left(strHex, Len(strHex) - 1)))) Case Else HexToDec = 0 End Select End Function Public Function HexToDec2(HexValue As String) As Long On Error Resume Next If UCase$(Left$(HexValue, 2)) = "0X" Then HexToDec2 = Val("&H" & Mid$(HexValue, 3)) ElseIf UCase$(Left$(HexValue, 2)) <> "&H" Then HexToDec2 = Val("&H" & HexValue) Else HexToDec2 = Val(HexValue) End If End Function ' Reinhard Henning 2012 ' Wandelt einen Single Wert in einen 4 Byte-Gleitkommawert nach IEEE um Public Sub SngToBuffer(sngInput As Single, Startbyte As Integer, Buffer() As Byte) Dim temp(0 To 3) As Byte CopyMemory temp(0), sngInput, 4 Buffer(Startbyte + 3) = temp(0) Buffer(Startbyte + 2) = temp(1) Buffer(Startbyte + 1) = temp(2) Buffer(Startbyte + 0) = temp(3) End Sub ' Reinhard Henning 2012 ' Wandelt eine 4 Byte-Gleitkommawert nach IEEE in einen Single Wert um Public Sub BufferToSng(Buffer() As Byte, Startbyte As Integer, Dest As Single) Dim temp(0 To 3) As Byte temp(0) = Buffer(Startbyte + 3) temp(1) = Buffer(Startbyte + 2) temp(2) = Buffer(Startbyte + 1) temp(3) = Buffer(Startbyte) CopyMemory Dest, temp(0), 4 End Sub Public Function connect(Station As Byte, Rack As Byte, Slot As Byte) As Boolean On Error GoTo Errorhandler Dim pConTable As CON_TABLE_TYPE Dim ConTableLen As Integer Dim AccessPoint As String Dim MyHex As String Dim ConNr As Integer Dim ret As Long Dim lngRet As Long pConTable.AdrType = 1 'MPI = 1 IP = 2 MAC = 3 pConTable.RackNr = Rack pConTable.SlotNr = Slot pConTable.Adr.Adresse(0) = Station pConTable.Adr.Adresse(1) = 0 pConTable.Adr.Adresse(2) = 0 pConTable.Adr.Adresse(3) = 0 pConTable.Adr.Adresse(4) = 0 pConTable.Adr.Adresse(5) = 0 ConTableLen = 9 ConNr = 0 AccessPoint = "S7ONLINE" MyHex = LoadConnection_ex6(ConNr, AccessPoint, ConTableLen, pConTable) ret = MyHex If ret = 0 Then connect = True Else ProdaveFehlerAnzeigen ret End If Exit Function Errorhandler: If Err.Number = 53 Then MsgBox "Fehler " & Err.Number & " in modProdave6.Connect(). 'LoadConnection_ex6' ist fehlgeschlagen. " & Err.Description & vbCrLf & "Prodave scheint nicht richtig installiert zu sein." Else MsgBox "Fehler " & Err.Number & " in modProdave6.Connect(). 'LoadConnection_ex6' ist fehlgeschlagen. " & Err.Description End If End Function Public Sub ProdaveFehlerAnzeigen(lngRet As Long) Dim errorBuffer(256) As Byte Dim MyChar As String Dim strHex strHex = Hex(lngRet) ret = GetErrorMessage_ex6(lngRet, 256, errorBuffer(0)) Call ByteToString(MyChar, errorBuffer, 200) If MyChar <> "" Then Call MsgBox(MyChar, vbOKOnly, "Procave LoadConnection_ex6 Fehler 0x" & strHex) Else MsgBox "Prodave (LoadConnection_ex6) Fehler 0x" & strHex & " (Fehlertext kann nicht angezeigt werden weil Prodave datei error.dat fehlt)" End If End Sub Public Function Dicconnect() As Boolean Dim ConNr As Integer Dim MyHex As String Dim ret As Long ConNr = 0 MyHex = UnloadConnection_ex6(ConNr) ret = MyHex If (ret = 0) Or (ret = 28720) Then Dicconnect = True Else ProdaveFehlerAnzeigen ret End If Dicconnect = False End Function Public Function GetVariablenAdrTypeDb(ByVal strVarname As String, ByRef StartAddess As Integer, ByRef DataType As EnumProdaveDATATYPE, ByRef byteDatenbausteinNr As Byte) As Boolean Dim lLen As Integer Dim sBuffer As String sBuffer = String(256, Chr$(0)) Dim strAdresse As String Dim strType As String 'lLen = GetPrivateProfileString("Prodave", strVarname, "", sBuffer, Len(sBuffer), "ProdaveMapping.ini") 'sBuffer = Left$(sBuffer, lLen) sBuffer = g_App.Settings.readStringValue("Prodave-Variabeln", strVarname, "") If sBuffer = "" Then WriteToLog "StartAdr und Type Angaben zur Prodave Variablen " & strVarname & " konnten nicht gefunden werden." LogIntoDB "StartAdr und Type Angaben zur Prodave Variablen " & strVarname & " konnten nicht gefunden werden." GetVariablenAdrTypeDb = False Exit Function Else strAdresse = Split(sBuffer, " ")(0) If IsNumeric(strAdresse) Then StartAddess = CInt(strAdresse) GetVariablenAdrTypeDb = True Else MsgBox "StartAdr " & strAdresse & " zur Prodave Variablen " & strVarname & " ist nicht numerisch" GetVariablenAdrTypeDb = False Exit Function End If strType = Split(sBuffer, " ")(1) Select Case UCase(strType) Case "BYTE" DataType = TypeByte Case "FLOAT" DataType = TypeFloat Case Else MsgBox "Type Angabe " & strType & " zur Prodave Variablen " & strVarname & " ist nicht definiert." GetVariablenAdrTypeDb = False Exit Function End Select Dim strTemp As String strTemp = Split(sBuffer, " ")(2) byteDatenbausteinNr = Val(strTemp) Select Case byteDatenbausteinNr Case 120, 121, 20, 43, 44 Case Else MsgBox "Prodave BausteinNr " & byteDatenbausteinNr & " (für " & strVarname & ") ist ungültig!" End Select End If End Function Public Sub CreateInIni(strVarname As String, strWert As String) g_App.Settings.saveStringValue "Prodave-Variabeln", strVarname, strWert End Sub Public Sub CreateIniWerte() 'CreateInIni "PT_BetrArt", "120 BYTE" 'CreateInIni "PT_Strecke1", "122 BYTE" 'CreateInIni "PT_P1Status", "124 BYTE" 'CreateInIni "PT_P2Status", "125 BYTE" 'CreateInIni "PT_P3Status", "126 BYTE" 'CreateInIni "PT_M1Status", "127 BYTE" 'CreateInIni "PT_M2Status", "128 BYTE" 'CreateInIni "PT_M3Status", "129 BYTE" 'CreateInIni "PT_M4Status", "130 BYTE" ' 'CreateInIni "PT_Stoer0", "200 BYTE" 'CreateInIni "PT_Stoer1", "201 BYTE" 'CreateInIni "PT_Stoer2", "202 BYTE" 'CreateInIni "PT_Stoer3", "203 BYTE" 'CreateInIni "PT_Stoer4", "204 BYTE" 'CreateInIni "PT_Stoer5", "205 BYTE" 'CreateInIni "PT_Stoer6", "206 BYTE" 'CreateInIni "PT_Stoer7", "207 BYTE" 'CreateInIni "PT_Stoer8", "208 BYTE" 'CreateInIni "PT_Stoer9", "209 BYTE" 'CreateInIni "PT_T_Einlauf", "144 BYTE" 'CreateInIni "PT_Qist", "140 FLOAT" 'CreateInIni "PT_Regler", "131 BYTE" 'CreateInIni "PT_PrfStatus", "132 BYTE" 'CreateInIni "PT_Waage", "133 BYTE" 'CreateInIni "PT_Fuell1", "240 FLOAT" 'CreateInIni "PT_Fuell2", "244 FLOAT" ' 'CreateInIni "VB_Betrieb", "160 BYTE" 'CreateInIni "VB_MidGr", "161 BYTE" 'CreateInIni "VB_Ablass", "170 BYTE" 'CreateInIni "VB_MidNr", "162 BYTE" 'CreateInIni "VB_Behaelter", "163 BYTE" ' 'CreateInIni "VB_Pumpe1", "164 BYTE" 'CreateInIni "VB_Pumpe2", "165 BYTE" 'CreateInIni "VB_Pumpe3", "166 BYTE" 'CreateInIni "VB_Pumpe5", "167 BYTE" ' 'CreateInIni "VB_Stoer0", "170 BYTE" 'CreateInIni "VB_Stoer1", "171 BYTE" 'CreateInIni "VB_Stoer2", "172 BYTE" 'CreateInIni "VB_Stoer3", "173 BYTE" 'CreateInIni "VB_Stoer4", "174 BYTE" 'CreateInIni "VB_Stoer5", "175 BYTE" 'CreateInIni "VB_Stoer6", "176 BYTE" 'CreateInIni "VB_Stoer7", "177 BYTE" 'CreateInIni "VB_Stoer8", "178 BYTE" 'CreateInIni "VB_Stoer9", "179 BYTE" ' 'CreateInIni "VB_QSoll", "180 FLOAT" 'CreateInIni "VB_Einsatz", "168 BYTE" 'CreateInIni "VB_RegelArt", "169 BYTE" ' 'CreateInIni "VB_QDiff", "184 FLOAT" 'CreateInIni "VB_Regu", "188 BYTE" 'CreateInIni "VB_ServoSt", "192 BYTE" End Sub