class CTNLuaModbus
{
public:
CTNLuaModbus();
~CTNLuaModbus();
/// \brief 基于TCP的modbus协议,设置设备IP地址和端口
/// \param strHost IP地址
/// \param iPort 端口
void setHost(const string &strHost, int iPort = 502);
/// \brief 基于232或485的modbus协议,设置通讯参数
/// \param strDevName 设备名称 /dev/ttyX (linux) | COMx (Windows)
/// \param iBaudRate 波特率
/// \param iStopBit 停止位
/// \param iDataBit 数据位
/// \param iParityBit 奇偶校验 0 n(无) 1 o(奇) 2 e(偶)
void setDevice(const string& strDevName,
int iBaudRate = 9600,
int iStopBit = 1,
int iDataBit = 8,
int iParityBit = 0);
/// \brief 打开连接
/// \param iSlaveId 设备Id
/// \param iMode 1 RTU 2 ASCII
/// \param iTimeOut 超时时间
/// \return true 成功
/// false 失败
bool open(int iSlaveId, int iMode = 1, int iTimeOut = 3000);
/// \brief 关闭连接
void close();
/// \brief 连接是否打开
/// \return true 已连接
/// false 未连接
bool isOpened();
/// \brief 读取字符串
/// \param iFuctionCode 功能代码
/// \param iAddress 地址
/// \param iLen 读取数据长度
/// \param strValue 数值(OUT)
/// \return true 成功
/// false 失败
bool readStr(int iFuctionCode, int iAddress, int iLen, CTNString &strValue);
/// \brief 写字符串
/// \param iFuctionCode 功能代码
/// \param iAddress 地址
/// \param strValue 数值
/// \return true 成功
/// false 失败
bool writeStr(int iFuctionCode, int iAddress, const string &strValue);
/// \brief 读取8位整数
/// \param iFuctionCode 功能代码
/// \param iAddress 地址
/// \param iVal 数值(OUT)
/// \return true 成功
/// false 失败
bool readInt8(int iFuctionCode, int iAddress, int &iVal);
/// \brief 写8位整数
/// \param iFuctionCode 功能代码
/// \param iAddress 地址
/// \param iVal 数值
/// \return true 成功
/// false 失败
bool writeInt8(int iFuctionCode, int iAddress, int iVal);
/// \brief 读取16位整数
/// \param iFuctionCode 功能代码
/// \param iAddress 地址
/// \param iVal 数值(OUT)
/// \return true 成功
/// false 失败
bool readInt16(int iFuctionCode, int iAddress, int &iVal);
/// \brief 写16位整数
/// \param iFuctionCode 功能代码
/// \param iAddress 地址
/// \param iVal 数值
/// \return true 成功
/// false 失败
bool writeInt16(int iFuctionCode, int iAddress, int iVal);
/// \brief 读取32位整数
/// \param iFuctionCode 功能代码
/// \param iAddress 地址
/// \param iVal 数值(OUT)
/// \param strEndian 字节序 以字母A、B、C、D表示设备上数值的字节序,ABCD为当前系统的字节序
/// \return true 成功
/// false 失败
bool readInt32(int iFuctionCode, int iAddress, int &iVal, const string &strEndian = "");
/// \brief 写32位整数
/// \param iFuctionCode 功能代码
/// \param iAddress 地址
/// \param iVal 数值
/// \param strEndian 字节序 以字母A、B、C、D表示设备上数值的字节序,ABCD为当前系统的字节序
/// \return true 成功
/// false 失败
bool writeInt32(int iFuctionCode, int iAddress, int iVal, const string &strEndian = "");
/// \brief 读取单精度浮点型数据
/// \param iFuctionCode 功能代码
/// \param iAddress 地址
/// \param fVal 数值(OUT)
/// \param strEndian 字节序 以字母A、B、C、D表示设备上数值的字节序,ABCD为当前系统的字节序
/// \return true 成功
/// false 失败
bool readFloat(int iFuctionCode, int iAddress, float &fVal, const string &strEndian = "");
/// \brief 写单精度浮点型数据
/// \param iFuctionCode 功能代码
/// \param iAddress 地址
/// \param fVal 数值
/// \param strEndian 字节序 以字母A、B、C、D表示设备上数值的字节序,ABCD为当前系统的字节序
/// \return true 成功
/// false 失败
bool writeFloat(int iFuctionCode, int iAddress, float fVal, const string &strEndian = "");
/// \brief 读取双精度浮点型数据
/// \param iFuctionCode 功能代码
/// \param iAddress 地址
/// \param dbVal 数值(OUT)
/// \param strEndian 字节序 以字母A、B、C、D、E、F、G、H表示设备上数值的字节序,ABCDEFGH为当前系统的字节序
/// \return true 成功
/// false 失败
bool readDouble(int iFuctionCode, int iAddress, double &dbVal, const string &strEndian = "");
/// \brief 写双精度浮点型数据
/// \param iFuctionCode 功能代码
/// \param iAddress 地址
/// \param dbVal 数值
/// \param strEndian 字节序 以字母A、B、C、D、E、F、G、H表示设备上数值的字节序,ABCDEFGH为当前系统的字节序
/// \return true 成功
/// false 失败
bool writeDouble(int iFuctionCode, int iAddress, double dbVal, const string &strEndian = "");
};