svrmtd.htm
来自「串口调试工具 用于串口调 试的很方便」· HTM 代码 · 共 801 行 · 第 1/2 页
HTM
801 行
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<html>
<head>
<meta http-equiv="Content-Type"
content="text/html; charset=iso-8859-1">
<meta name="GENERATOR" content="Microsoft FrontPage 2.0">
<title>Modbus Server Methods</title>
</head>
<body bgcolor="#FFFFFF">
<p><font size="5"><strong>Modbus Server Methods </strong></font></p>
<p><font size="3">Modbus server implements a subset of modbus
protocol functions. This server works with serial devices
(RTU-ASCII) or Open modbus protocol.</font></p>
<p><font size="3">One important comment about these functions is
that <strong>all functions use a zero based index for address.</strong>
For instance, if you want to set the register 40001 (4x) using
PresetSingleRegister function you set the parameter <strong>nRegister
equal to 0. </strong></font></p>
<p><font size="3"><strong>Connection methods</strong></font></p>
<p><a href="#mbusrv.OpenConnection"><font size="3"><strong>OpenConnection</strong></font></a><font
size="3"> - creates a new connection object for use with serial
port or tcp/ip network </font></p>
<p><a href="#mbusrv.Connect"><font size="3"><strong>Connect</strong></font></a><font
size="3"> - This function must be called after setting connection
parameters.<br>
</font></p>
<p><a href="#mbusrv.CloseConnection"><font size="3"><strong>CloseConnection</strong></font></a><font
size="3"> - Free a connection resource , for instance , a com
port.<br>
</font></p>
<p><a href="#mbussrv.CreateTCPServer"><font size="3"><strong>CreateTCPServer</strong></font></a><font
size="3"> - Creates a new CTCPIPServer object. This object
manages TCP/IP serial port interface.</font></p>
<p><font size="3"><strong>Modbus Functions:</strong></font></p>
<p><a href="#CModbus::ReadOutputRegisters"><font size="3"><strong>ReadOutputRegisters</strong></font></a>
Reads the holding registers (4<i>x</i> references). </p>
<p><a href="#CModbus::ReadInputRegisters"><font size="3"><strong>ReadInputRegisters</strong></font></a><font
size="3"><strong> </strong></font>Reads the input registers (3X
references).</p>
<p><a href="#CModbus::ReadOutputStatus"><font size="3"><strong>ReadOutputStatus</strong></font></a><font
size="3"><strong> </strong></font>Reads the discrete outputs (0<i>x</i>
references, coils).</p>
<p><a href="#CModbus::ReadOutputStatus"><font size="3"><strong>ReadInputStatus</strong></font></a><font
size="3"><strong> </strong></font>Reads the discrete inputs (1<i>x</i>
references, coils).</p>
<p><a href="#CModbus::PresetSingleRegister"><font size="3"><strong>PresetSingleRegister</strong></font></a><font
size="3"><strong> </strong></font>Presets a single holding
register (4<i>x</i> reference)</p>
<p><a href="#CModbus::ForceSingleCoil"><font size="3"><strong>ForceSingleCoil</strong></font></a><font
size="3"><strong> </strong></font>Forces a single coil (0<i>x</i>
reference) to either True or False (On/Off).</p>
<p><a href="#CModbus::PresetMultipleRegisters"><font size="3"><strong>PresetMultipleRegisters</strong></font></a><font
size="3"><strong> </strong></font>Presets multiple holding
registers (4<i>x</i> reference)</p>
<p><a href="#CModbus::ForceSingleCoil"><font size="3"><strong>ForceMultipleCoils</strong></font></a><font
size="3"><strong> </strong></font>Forces multiple coils(0<i>x</i>
reference) to either True or False (On/Off).</p>
<p><a href="#CModbus::TxRxMessage"><font size="3"><strong>TxRxMessage</strong></font></a><font
size="3"><strong> </strong>this function can be used for sending
custom messages to a slave.</font></p>
<p> </p>
<p><a name="mbusrv.OpenConnection"></a><font size="5"><strong>OpenConnection</strong></font></p>
<p><strong>Syntax</strong></p>
<p>mbusrv.OpenConnection( Name,Type);</p>
<p>HRESULT OpenConnection([in] BSTR Name , [in] short Type ,
[out,retval] VARIANT_BOOL* pbOk);</p>
<p><strong>Return Value </strong></p>
<p><font size="3">True if function succeeds or False if fails.</font></p>
<p><font size="3"><strong>Parameters</strong></font></p>
<p><font size="3">Name - A string that specifies the connection's
name. </font></p>
<p><font size="3">Type - Type of connection. <br>
mbLOCAL=1 - connect with using serial port <br>
mbREMOTE=2 - connect using TCP/IP.</font></p>
<p><font size="3"><strong>Remarks</strong></font></p>
<p><font size="3">This method must be called before setting
connection properties like baudrate, Parity...</font></p>
<p><font size="3">The connection name can be any text , but you
can only share connections among apps with the same connection
name. Use , for instance , Name = "com2" for opening
com2 , "com3" for opening com3 and so on. To connect
using TCP/IP you must have a device that use </font><a
href="http://www.modicon.com/OPENMBUS/">Open Modbus Protocol</a>
or enable TCP Serial port interface.</p>
<p>Example</p>
<p>Dim mbusrv AS ModbusSrv</p>
<p>Set mbusrv = New ModbusSrv<br>
<br>
'Set parameters as your hardware requirements<br>
mbusrv.OpenConnection "com3", mbLOCAL 'change com port<br>
mbusrv.ComPort = 3 'change com port<br>
mbusrv.BaudRate = 9600<br>
mbusrv.Parity = mbNOPARITY<br>
mbusrv.FlowControl = mbFC_NONE<br>
mbusrv.SilentInterval = 20<br>
mbusrv.TimeOut = 500<br>
mbusrv.TransmissionMode = mbMODE_RTU<br>
mbusrv.ByteSize = 8<br>
mbusrv.StopBits = 2<br>
<br>
mbusrv.RaiseError = False<br>
<br>
If Not mbusrv.Connect Then<br>
MsgBox "Error connecting with serial port Try Change
Parameters of serial port"</p>
<p>End if </p>
<p><font size="3"><strong>See Also</strong>: </font><a
href="#mbusrv.Connect"><font size="3"><strong>Connect</strong></font></a></p>
<p><a name="mbusrv.Connect"></a><font size="5"><strong>Connect</strong></font></p>
<p><strong>Syntax</strong></p>
<p>mbusrv.Connect</p>
<p>HRESULT Connect([out,retval] VARIANT_BOOL* pbConnected);</p>
<p><strong>Return Value </strong></p>
<p><font size="3">True if function succeeds or False if fails.</font></p>
<p><font size="3"><strong>Remarks</strong></font></p>
<p>Calling "Connect" actually try to open a comm port
or try to connect with a tcp server. The comm parameters <font
size="3">(Stopbits, baudrate..) or TCP Client parameters (Host,
Port and Timeout) must be set before calling this method.</font></p>
<p><font size="3">Example</font></p>
<p><font size="3">'Set m_ModbusServer = New ModbusSrv<br>
<br>
'Set parameters as your hardware requirements<br>
m_ModbusServer.OpenConnection "127.0.0.1:502", mbREMOTE<br>
m_ModbusServer.Host = "127.0.0.1"<br>
m_ModbusServer.TcpPort = 502<br>
m_ModbusServer.TimeOut = 2000<br>
<br>
If Not m_ModbusServer.Connect Then<br>
MsgBox "Error connecting with TCP/IP Server. Try to change
TCP/IP parameters"<br>
end if </font></p>
<p><font size="3"><strong>See Also</strong>:</font><a
href="#mbusrv.OpenConnection"><font size="3"><strong>OpenConnection</strong></font></a><font
size="3"> </font></p>
<p> </p>
<p><a name="mbusrv.CloseConnection"></a><font size="5"><strong>CloseConnection</strong></font></p>
<p><strong>Syntax</strong></p>
<p>mbusrv.CloseConnection</p>
<p>HRESULT CloseConnection();</p>
<p><font size="3"><strong>Remarks</strong></font></p>
<p><font size="3">Free a connection resource , for instance , a
com port.</font></p>
<p><font size="3"><strong>See Also</strong>:</font><a
href="#mbusrv.Connect"><font size="3"><strong>Connect</strong></font></a><font
size="3"><strong> , </strong></font><a
href="#mbusrv.OpenConnection"><font size="3"><strong>OpenConnection</strong></font></a><font
size="3"> </font></p>
<p> </p>
<p><a name="mbussrv.CreateTCPServer"></a><font size="5"><strong>CreateTCPServer</strong></font></p>
<p><strong>Syntax</strong></p>
<p>mbusrv.CreateTCPServer()</p>
<p>HRESULT CreateTCPServer([out,retval] LPDISPATCH* pVal);</p>
<p><strong>Return Value </strong></p>
<p><font size="3">A CTCPIPServer object correspondent to the
local connection of </font>mbusrv. For instance , if mbusrv
correspond to a connection with com2 , calling this method you
create a <font size="3">CTCPIPServer object and with this last
object you can start the server and enable TCP/IP clients send
messages to com2.</font></p>
<p><font size="3"><strong>Remarks</strong></font></p>
<p><font size="3">Creates a new CTCPIPServer object. This object
manages TCP/IP serial port interface.</font></p>
<p> </p>
<p><font size="3"><strong>Example</strong></font></p>
<p><font size="3">Dim objTcpServer As Object</font></p>
<p><font size="3">'</font>mbusrv must be a local connection
created in some other place.</p>
<p><font size="3">Set objTcpServer = </font>mbusrv<font size="3">.CreateTCPServer<br>
<br>
'change this address<br>
objTcpServer.ServerAddress = "127.0.0.1"<br>
objTcpServer.ServerPort = 502<br>
<br>
If Not objTcpServer.StartServer Then<br>
MsgBox "Error Starting TCP Serial Port Interface Try. to
change server address "<br>
End If</font></p>
<p><font size="3">See Also : </font><a href="ctcpsrv.htm"><font
size="3">CTCPIPServer</font></a></p>
<p> </p>
<p><a name="CModbus::ReadOutputRegisters"></a><font size="5"><strong>ReadOutputRegisters</strong></font></p>
<p><font size="3"><strong>Syntax</strong></font></p>
<p>mbusrv.<font size="3">ReadOutputRegisters(Addr , DataStart
,Quantity ,vRegValues , [vVarType] ,[vRealType])</font></p>
<p><font size="3">HRESULT ReadOutputRegisters([in] short Addr ,
[in] long DataStart , [in] short Quantity , [in,out] VARIANT*
vRegValues , [in,optional] VARIANT vVarType , [in,optional]
VARIANT vRealType,[out,retval] long* lpRetVal);</font></p>
<p><font size="3"><strong>Return Value </strong></font></p>
<p><font size="3">A error code if the function failed or mbErrOk
if succeed. </font></p>
<p><font size="3"><strong>Parameters </strong></font></p>
<p><font size="3">Addr - Slave Address</font></p>
<p><font size="3">DataStart - Starting Address</font></p>
<p><font size="3">Qtd - number of registers to read </font></p>
<p><font size="3">vRegValues - array with registers read.</font></p>
<p><font size="3">vVarType - vbInteger - read values as signed
integer numbers.<br>
vbLong - read values as unsigned integer numbers.(default)<br>
vbSingle - read values as floating point single precision
numbers.<br>
vbDouble - read values as floating point double precision
numbers.</font></p>
<p><font size="3">wRealType - inverse the order of registers when
reading real number mbREAL_NORMAL(default) (not reversed)
mbREAL_REVERSE (reverse order).</font></p>
<p> </p>
<p><font size="3"><strong>Remarks</strong></font></p>
<p>This function reads the holding registers (4<i>x</i>
references), the first register 40001 is 0, second 40002 is 1 and
so on..When this function is used for interpret modbus registers
as IEEE floating point numbers you have to observe two things:
First <font size="3">single precision number (float) has 4 bytes
, then we need 2 consecutive registers to form a float number.
Another thing we have consider is that not all slaves split the
float number in the same manner then you can use wRealType
parameter as mbREAL_REVERSE to change the order the 2 consecutive
registers to see if the float number is interpreted correctly.
The same explanation is valid for double precision numbers , but
now we need 4 registers instead of 2 to form a number.</font></p>
<p><strong>example</strong>:</p>
<p>Dim vRegs AS Variant </p>
<p>Dim lError As Long </p>
<p>lError = mbusrv.<font size="3">ReadOutputRegisters(17,107,3,</font>vRegs)
; 'Reads 40108 ...40110 registers from slave 17 </p>
<p><font size="3"><strong>See also: </strong></font><a
href="svrprp.htm#modsrv.RaiseError"><font size="3"><strong>RaiseError</strong></font></a><font
size="3"><strong> , </strong></font><a href="srvctes.htm"><font
size="3"><strong>Error Codes</strong></font></a><font size="3"><strong>
.</strong></font></p>
<p> </p>
<p><a name="CModbus::ReadInputRegisters"></a><font size="5"><strong>ReadInputRegisters</strong></font></p>
<p><font size="3"><strong>Syntax</strong></font></p>
<p>mbusrv.<font size="3">ReadInputRegisters(Addr , DataStart
,Quantity ,vRegValues , [vVarType] , [vRealType])</font></p>
<p><font size="3">HRESULT ReadInputRegisters([in] short Addr ,
[in] long DataStart , [in] short Quantity , [in,out] VARIANT*
vRegValues , [in,optional] VARIANT vVarType , [in,optional]
VARIANT vRealType, [out,retval] long* lpRetVal);</font></p>
<p><font size="3"><strong>Return Value</strong></font></p>
<p><font size="3">A error code if the function failed or mbErrOk
if succeed. </font></p>
<p><font size="3"><strong>Parameters </strong></font></p>
<p><font size="3">Addr - Slave Address</font></p>
<p><font size="3">DataStart - Starting Address</font></p>
<p><font size="3">Qtd - number of registers to read </font></p>
<p><font size="3">vRegValues - array with registers read.</font></p>
<p><font size="3">vVarType - vbInteger - read values as signed
integer numbers.<br>
vbLong - read values as unsigned integer numbers.(default)<br>
vbSingle - read values as floating point single precision
numbers.<br>
vbDouble - read values as floating point double precision
numbers.</font></p>
<p><font size="3">wRealType - inverse the order of registers when
reading real number mbREAL_NORMAL(default) (not reversed)
mbREAL_REVERSE (reverse order).</font></p>
<p><font size="3"><strong>Remarks</strong></font></p>
<p>This function reads the input registers (3<i>x</i>
references), the first register 30001 is 0, second 30002 is 1 and
so on.When this function is used for interpret modbus registers
as IEEE floating point numbers you have to observe two things:
First <font size="3">single precision number (float) has 4 bytes
, then we need 2 consecutive registers to form a float number.
Another thing we have consider is that not all slaves split the
float number in the same manner then you can use vRealType
parameter as mbREAL_REVERSE to change the order the 2 consecutive
registers to see if the float number is interpreted correctly.
The same explanation is valid for double precision numbers , but
now we need 4 registers instead of 2 to form a number.</font></p>
<p><strong>example</strong>:</p>
<p>Dim vRegs AS Variant </p>
<p>Dim lError As Long </p>
<p>lError = mbusrv.<font size="3">ReadInputRegisters(17,8,1,</font>vRegs)
; 'Reads 30009 register from slave 17 </p>
<p><font size="3"><strong>See also: </strong></font><a
href="svrprp.htm#modsrv.RaiseError"><font size="3"><strong>RaiseError</strong></font></a><font
size="3"><strong> , </strong></font><a href="srvctes.htm"><font
size="3"><strong>Error Codes</strong></font></a><font size="3"><strong>
.</strong></font></p>
<p> </p>
<p><a name="CModbus::ReadOutputStatus"></a><font size="5"><strong>ReadOutputStatus</strong></font></p>
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?