如何编程读取智能电表的数据?

智能电表使用RS485线路连接至电脑的RS232端口(有485转232转接器),如何编程读取智能电表的数据?用什么编程软件?Delphi行吗?... 智能电表使用RS485线路连接至电脑的RS232端口(有485转232转接器),如何编程读取智能电表的数据?用什么编程软件?Delphi行吗? 展开
 我来答
tn瓶邪
推荐于2017-10-11 · TA获得超过1882个赞
知道小有建树答主
回答量:610
采纳率:98%
帮助的人:113万
展开全部
方 法:
/// <summary>
/// 只能通过CreateInstance方法来创建类的实例。单例模式
/// </summary>
public static ElectricityMeter CreateInstance()
{
return _instance;
}
/// <summary>
/// 打开设备
/// </summary>
/// <param name="portName">串口号</param>
/// <param name="frm">调用这个类的窗体。</param>
public void Open( string portName, Form frm )
{
try
{
// 初始化窗体对象
_frm = frm;
_frm.FormClosing += new FormClosingEventHandler( _frm_FormClosing );
//初始化SerialPort对象
_serialPort.PortName = portName;
_serialPort.BaudRate = 2400; // 请将设备的波特率设置为此。
_serialPort.DataBits = 8;
_serialPort.StopBits = StopBits.One;
_serialPort.Parity = Parity.Even;
_serialPort.Open();
}
catch( Exception e )
{
MessageBox.Show( e.Message );
}
}
/// <summary>
/// 关闭设备。
/// </summary>
public void Close()
{
if( _serialPort.IsOpen == true )
{
_serialPort.Close();
_serialPort.Dispose();
}
}
/// <summary>
/// 获取耗电量
/// </summary>
public Decimal GetPowerConsumption()
{
if( _serialPort.IsOpen == true )
{
// 十六进制的命令字符串
string strCmd = "68 AA AA AA AA AA AA 68 11 04 33 33 33 33 AD 16";
// 转换为十六进制的字节数组
string[] strs = strCmd.Split( new char[] { ' ' } ); // 空格分组
byte[] cmdBytes = new byte[ strs.Length ];
// 转换为十进制的字节数组
for( int i = 0; i < cmdBytes.Length; i++ ) {
cmdBytes[ i ] = Convert.ToByte( strs[ i ], 16 ); // 16进制转换为10进制
}
_serialPort.Write( cmdBytes, 0, cmdBytes.Length );
System.Threading.Thread.Sleep( 500 ); // 500ms内应当有响应
byte[] resultBytes = new byte[ 21 ]; // 容量为21的字节数组
_serialPort.Read( resultBytes, 0, resultBytes.Length );
string n1 = Convert.ToString( resultBytes[ 18 ] - 51, 16 ); // 将十进制转成16进制的字符串
string n2 = Convert.ToString( resultBytes[ 17 ] - 51, 16 ); // 将十进制转成16进制的字符串
string n3 = Convert.ToString( resultBytes[ 16 ] - 51, 16 ); // 将十进制转成16进制的字符串
string n4 = Convert.ToString( resultBytes[ 15 ] - 51, 16 ); // 将十进制转成16进制的字符串
string resultString = n1 + n2 + n3 + "." + n4;
return Decimal.Parse( resultString );
}
else
{
throw new Exception( "串口没有打开" );
}
}
/// <summary>
/// 在窗体关闭的时候关闭串口连接。
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void _frm_FormClosing( object sender, FormClosingEventArgs e )
{
this.Close();
}
}
120581768
2012-12-17 · TA获得超过783个赞
知道小有建树答主
回答量:92
采纳率:100%
帮助的人:118万
展开全部
1、电表的主要数据(如电量等)在液晶显示里都可以显示出来,你可以通过按电表上的按键翻看。
2、如果你想通过RS485抄数据,根据DLT645-2007规约,可以抄到更多数据,当然,根据不同地区的差异,不是所有的功能都是有效的,因为涉及的数据很多,你可以查看一下DLT645-2007这个规约,里面有通讯数据及相关解码规则。Delphi本人不懂,但是只要你按规约里的规则发送读取命令(前提是硬连接上没有问题,波特率一致),电表都会返回数据(当然,不包括不允许返回的数据),按规则解码就是。
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友29f1b27
2012-12-15
知道答主
回答量:10
采纳率:0%
帮助的人:4.3万
展开全部
Delphi 只是个开发系统的软件,智能电表内部有加密芯片ESAM,此芯片是有中国电力科学研究院发行的,所以想读取数据并不是那么简单
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
黎乐穆宁Bhb58
2012-12-18
知道答主
回答量:72
采纳率:100%
帮助的人:24.6万
展开全部
电表编程一般用c语言。
既然是要读取电表数据,那么电表肯定是已经灌好程序,那么只需要一个基于某通讯规约(具体看电表用的哪种)编制的通讯软件就好。界面命令已经是解析好的。需要读取哪条就选哪条。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
godboy00
2012-12-17 · 超过10用户采纳过TA的回答
知道答主
回答量:30
采纳率:0%
帮助的人:21.9万
展开全部
同问,期待答案
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式