Hallo.
Ich versuche mein Netzteil (DPS3005) mittels serieller Schnittstelle (Modbus RTU) auszulesen und einzustellen.
Hierfür habe ich die Modbus UDF (modbus) gefunden.
In dieser gab es zwar nur die TCP IP verbindung, die verwendete DLL(libmodbus.dll; https://libmodbus.org/docs/v3.0.8/) kann aber auch eine RTU Verbindung über die Serielle schnittstelle aufbauen.
Ich kenne mich mit DLL´s nicht wirklich aus, habe aber basierend auf der TCP Funktion die RTU Funktion nachgebaut.
Ich bekomme aber leider immer nur eine NULL als Antwort, was bedeutet das ein Fehler im DLL Call ist.
Ich komme jetzt nicht mehr weiter.
Ich weiß das es auch andere UDF´s für die Serielle Schnittstelle gibt, dort weiß ich aber nicht wie genau ich dann die Werte ändern kann.
Bzw. Was ich dann Senden muss.
Würde mich sehr über Hilfe freuen, egal ob bei der Modbus UDF oder auch bei einer Anderen UDF.
Anbei mal mein Sourcecode sowie das Kommunikationsprotokoll des Netzteils.
#include <modbus.au3>
Func _Modbus_New_RTU()
Local $aRet = DllCall($hDLL_Modbus, "ptr:cdecl", "modbus_new_rtu", "str", "COM3", "int", 9600,"str", "N","int", 8,"int", 1)
;modbus_t *modbus_new_rtu(const char *device, int baud, char parity, int data_bit, int stop_bit);
_ArrayDisplay($aRet)
Return $aRet[0]
EndFunc ;==>_Modbus_New_RTU
Func _ComListPorts()
Local $regKey = 'HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM'
Local $regVal = ''
Local $regDat = ''
Local $comPortList[0]
For $i = 1 To 256
$regVal = RegEnumVal($regKey, $i)
If @error Then ExitLoop
$regDat = RegRead($regKey, $regVal)
If @error Then ExitLoop
ReDim $comPortList[$i]
$comPortList[$i-1] = $regDat
Next
If UBound($comPortList)=0 Then Return -1
Return $comPortList
EndFunc ;==>_ComListPorts
HotKeySet("{ESC}", "Terminate")
$comports = _ComListPorts()
$search = _ArraySearch($comports, "COM3")
if $search = -1 then
MsgBox(0, "Error " & @error, "COM 3 nicht vorhanden")
endif
_example_libDll()
MsgBox(0, "EXIT", "End of Sample")
Exit
;--------------------------------------------------------------------------------------
Func _example_libDll()
_Modbus_DllOpen()
Global $tModbus = _Modbus_New_RTU()
$connect = _Modbus_Connect($tModbus)
MsgBox(0, '', $connect)
If $connect = -1 Then
ConsoleWrite("! Fehler: Es konnte keine Verbindung aufgebaut werden." & @CRLF)
_Modbus_Free($tModbus)
Exit
EndIf
Global $aVal
$aVal = _Modbus_Set_Debug($tModbus, 1)
;Global $aVal = _Modbus_Read_Registers($tModbus, 0, 1)
;Global $aVal = _Modbus_Read_Input_Registers($tModbus, 0, 1)
;Global $aVal = _Modbus_Read_Input_Bits($tModbus, 5)
;Global $aVal = _Modbus_Read_Bits($tModbus, 5)
;Global $aVal = _Modbus_Write_Bit($tModbus, 0, 1 )
;Global $aVal = _Modbus_Write_Register($tModbus, 0, 8 )
_Modbus_Close($tModbus)
_Modbus_Free($tModbus)
EndFunc ;==>_example_libDll
Func Terminate()
Exit 0
EndFunc ;==>Terminate
Alles anzeigen