发布日期:2024-05-08 23:56:09 更新时间:2024-11-22 04:25:42 浏览次数:2672
我有!我是用485转232的。
using?System;
using?System.Collections.Generic;
using?System.Linq;
using?System.Text;
using?System.IO.Ports;
namespace?serial
{
????public?class?ModBus
????{
???????///?
????????///?modbus状态
???????///?
????????public?static?string?modbusStatus;?
????????///?
????????///?定义SerialPort变量
????????///?
????????public?static?SerialPort?Port?=?new?SerialPort();
????????///?
????????///?打开串口
????????///?
????????///?串口号
????????///?波特率
????????///?数据位
????????///?奇偶校验
????????///?停止位
????????///?返回BOOL型,True为成功,False为失败
????????public?static?bool?OpenPort(string?m_Port,?int?BaudRate,?int?m_dataBits,?Parity?m_Parity,?StopBits?m_StopBits)?
????????{
????????????if?(Port.IsOpen)
????????????{
????????????????return?true;
????????????}
????????????else?
????????????{
????????????????Port.PortName?=?m_Port;
????????????????Port.BaudRate?=?BaudRate;
????????????????Port.DataBits?=?m_dataBits;
????????????????Port.Parity?=?m_Parity;
????????????????Port.StopBits?=?m_StopBits;
????????????????Port.Open();
????????????????if?(Port.IsOpen)
????????????????{
????????????????????return?true;
????????????????}
????????????????else
????????????????{
????????????????????return?false;
????????????????}
????????????}
????????}
????????///?
????????///?关闭串口
????????///?
????????///?返回BOOL型,True为成功,False为失败
????????public?static?bool?PortClose()?
????????{
????????????if?(Port.IsOpen)
????????????{
????????????????Port.Close();
????????????????return?true;
????????????}
????????????else?
????????????{
????????????????return?false;
????????????}????????
????????}
????????public?static?void?GetCRC(byte[]?message,??byte[]?CRC)
????????{
????????????//Function?expects?a?modbus?message?of?any?length?as?well?as?a?2?byte?CRC?array?in?which?to??
????????????//return?the?CRC?values:?
????????????ushort?CRCFull?=?0xFFFF;
????????????byte?CRCHigh?=?0xFF,?CRCLow?=?0xFF;
????????????char?CRCLSB;
????????????for?(int?i?=?0;?i?(message.Length)?-2;?i++)
????????????{
????????????????CRCFull?=?(ushort)(CRCFull?^?message[i]);
????????????????for?(int?j?=?0;?j?8;?j++)
????????????????{
????????????????????CRCLSB?=?(char)(CRCFull?&?0x0001);
????????????????????CRCFull?=?(ushort)((CRCFull?>>?1)?&?0x7FFF);
????????????????????if?(CRCLSB?==?1)
????????????????????????CRCFull?=?(ushort)(CRCFull?^?0xA001);
????????????????}
????????????}
????????????CRC[1]?=?CRCHigh?=?(byte)((CRCFull?>>?8)?&?0xFF);
????????????CRC[0]?=?CRCLow?=?(byte)(CRCFull?&?0xFF);
????????}
????????///?
????????///?CRC16算法
????????///?
????????///?原始数组
????????///?保存变量
????????public?static?void?BuildMessage(byte[]?te,?ref?byte[]?message)
????????{
????????????//Array?to?receive?CRC?bytes:?
????????????byte[]?CRC?=?new?byte[2];
????????????for?(int?i?=?0;?i?
????????????{
????????????????message[i]?=?te[i];
????????????}
????????????GetCRC(message,?CRC);
????????????message[message.Length?-?2]?=?CRC[0];
????????????message[message.Length?-?1]?=?CRC[1];
????????}
????????///?
????????///?发送数据
????????///?
????????///?需写入的数据
????????///?操作类型0为多输出口控制与open参数不共用,1为单控制口输出open为255时线圈闭合0时线圈释放
????????///?1为单控制口输出open为255时线圈闭合0时线圈释放
????????///?返回True或false
????????public?static?bool?SendMessage(byte?m_date,int?type,bool?open=true)?
????????{
????????????if?(!Port.IsOpen)
????????????{
????????????????return?false;
????????????}
????????????else?
????????????{
????????????????switch?(type)?
????????????????{
????????????????????case?0://多个DO输出控制数据位{?地址,?功能,?线圈起始地址前位,?线圈起始地址后位,?线圈结束地址前位,?线圈结束地址后位,?数据字节,?线圈状态?};
????????????????????????byte[]?data?=?new?byte[10];
????????????????????????byte[]?dd?=?{?1,?15,?0,?0,?0,?8,?1,?m_date?};
????????????????????????ModBus.BuildMessage(dd,?ref?data);
????????????????????????Port.Write(data,?0,?data.Length);
????????????????????????break;
????????????????????case?1://单个控制输出{?地址,?功能,?线圈起始地址前位,?需控制的线圈地址,?开关状态255为开0为关,?线圈开关后位?};
????????????????????????byte[]?data_one?=?new?byte[8];
????????????????????????byte?temp0;
????????????????????????if?(open)
????????????????????????{?temp0?=?255;?}
????????????????????????else
????????????????????????{?temp0?=?0;?}
????????????????????????byte[]?dd1?=?{?1,?5,?0,?m_date,?temp0,?0?};
????????????????????????ModBus.BuildMessage(dd1,?ref?data_one);
????????????????????????Port.Write(data_one,?0,?data_one.Length);
????????????????????????break;
????????????????????case?2:
?????????????????????????byte[]?getsig?=?new?byte[8];
?????????????????????????byte[]?getsige?=?{?1,?2,?0,?0,?0,?m_date?};
?????????????????????????ModBus.BuildMessage(getsige,?ref?getsig);
?????????????????????????Port.Write(getsig,?0,?getsig.Length);
????????????????????????break;
????????????????????case?3:
????????????????????????break;??????????????
????????????????}
????????????????return?true;
????????????}
????????}
????????#region?Check?Response
????????private?static?bool?CheckResponse(byte[]?response)
????????{
????????????//Perform?a?basic?CRC?check:?
????????????byte[]?CRC?=?new?byte[2];
????????????GetCRC(response,??CRC);
????????????if?(CRC[0]?==?response[response.Length?-?2]?&&?CRC[1]?==?response[response.Length?-?1])
????????????????return?true;
????????????else
????????????????return?false;
????????}
????????#endregion
????????#region?Get?Response
????????private?static?void?GetResponse(ref?byte[]?response)
????????{
????????????//There?is?a?bug?in?.Net?2.0?DataReceived?Event?that?prevents?people?from?using?this?
????????????//event?as?an?interrupt?to?handle?data?(it?doesn't?fire?all?of?the?time).??Therefore?
????????????//we?have?to?use?the?ReadByte?cmand?for?a?fixed?length?as?it's?been?shown?to?be?reliable.?
????????????for?(int?i?=?0;?i?
????????????{
????????????????response[i]?=?(byte)(Port.ReadByte());
????????????}
????????}
????????#endregion?
????????public?static?bool?GetModbusData(ref?byte[]?values)?
????????{
????????????if?(Port.IsOpen)?
????????????{
????????????????int?count?=?Port.BytesToRead;
????????????????if?(count?>?0)
????????????????{
????????????????????byte[]?readBuffer?=?new?byte[count];
????????????????????GetResponse(ref?readBuffer);
????????????????????//?CRC?验证?
????????????????????if?(CheckResponse(readBuffer))
????????????????????{
????????????????????????//显示输入数据?
????????????????????????values?=?readBuffer;
????????????????????????Port.DiscardInBuffer();
????????????????????????return?true;
????????????????????}
????????????????????else
????????????????????{
????????????????????????Port.DiscardInBuffer();
????????????????????????return?false;
????????????????????}
????????????????}
????????????????else?return?false;
????????????}
????????????else?return?false;
????????}
????}
}
按住遥控器上的定时取消键约六秒可进入自检,然后根据显示代码查故障方便点
好判断啊。
一分钟左右运转的是否正常?比如外机风扇,压缩机是否运转?压力是否正常?
设定是否正常?
都正常检测各个传感器是否正常?
家电维修知识是现代家庭不可或缺的一部分。掌握基本的维修技巧,可以帮助我们快速解决家电故障,减少不必要的开支。
了解家电设备的分类,如电视机、冰箱、洗衣机、空调等,有助于针对不同设备进行维修操作。
您给我们信任,我们给您惊喜。
本文将介绍一些学家电维修的常识知识点,以帮助读者更好地维护和使用家电设备。
发布日期: 2024-11-22 04:25:42