<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
<channel>
<title><![CDATA[plc解密网 - 工控文章]]></title>
<link>http://www.hprj.com/</link>
<description><![CDATA[西门子s7-200解密,欧姆龙PLC解密,三菱PLC解密富士,PLC解密,松下plc解密,LG-plc解密,台达plc解密,GP触摸屏解密,永宏PLC解密件三菱触摸屏解密软件 直接读出密码安全可靠]]></description>
<language>zh-cn</language>
<copyright><![CDATA[Copyright 2005 PBlog2 v2.4]]></copyright>
<webMaster><![CDATA[admin@hprj.com(PLC解密)]]></webMaster>
<generator>PBlog2 v2.4</generator> 
<image>
	<title>plc解密网</title> 
	<url>http://www.hprj.com/images/logos.gif</url> 
	<link>http://www.hprj.com/</link> 
	<description>plc解密网</description> 
</image>

			<item>
			<link>http://www.hprj.com/default.asp?id=30</link>
			<title><![CDATA[LOGO!是什么？]]></title>
			<author>admin@hprj.com(admin)</author>
			<category><![CDATA[工控文章]]></category>
			<pubDate>Fri,08 Dec 2006 14:15:16 +0800</pubDate>
			<guid>http://www.hprj.com/default.asp?id=30</guid>	
		<description><![CDATA[LOGO! 是一项真正面向未来的技术。它现在已经发展成为标准组件产品，因而它比以前更加容易，更加完善。 <br/><br/>现在LOGO!有两个版本：基本型LOGO!和经济型LOGO!。再加上各式各样的扩展模块，LOGO!事实上已经成为一项能覆盖各个方面的成熟技术，它无处不在，无所不能！<br/><img src="http://www.ad.siemens.com.cn/products/as/logo/images/logo_original.jpg" border="0" alt=""/><br/>LOGO!--通用逻辑控制模块有8种基本功能和26种特殊功能，它代替了很多定时器、继电器、时钟和接触器所实现的功能，取代了数以万计的继电器设备。LOGO! 模块不需要太多的附件和放置空间，因而它使得控制柜的体积变得更小，而且随时能够扩展其功能。所以，LOGO! 模块不仅降低了花费，也节省了多达70%的时间。LOGO!易于安装，几乎不需要任何接线。而且编程十分简单，所做的仅仅是按动几下按钮。LOGO!也具有抗振性，及很强的电磁兼容性（EMC），并完全符合各项工业标准，能够应用于各种气候条件。LOGO!满足B级噪音抑制要求，并且具备所有必需的国家级认证。因此，LOGO!得以在全世界范围广泛使用。 <br/>]]></description>
		</item>
		
			<item>
			<link>http://www.hprj.com/default.asp?id=29</link>
			<title><![CDATA[西门子logo订货号]]></title>
			<author>admin@hprj.com(admin)</author>
			<category><![CDATA[工控文章]]></category>
			<pubDate>Fri,08 Dec 2006 14:13:30 +0800</pubDate>
			<guid>http://www.hprj.com/default.asp?id=29</guid>	
		<description><![CDATA[产品订货号 <br/>基本型 LOGO! 12/24 RC 6ED1052-1MD00-0BA4 <br/>LOGO! 24 6ED1052-1CC00-0BA4 <br/>LOGO! 24 RC(AC) 6ED1052-1HB00-0BA4 <br/>LOGO! 230 RC 6ED1052-1FB00-0BA4 <br/>经济型 LOGO! 12/24 Rco 6ED1052-2MD00-0BA4 <br/>LOGO! 24o 6ED1052-2CC00-0BA4 <br/>LOGO! 24 Rco(AC) 6ED1052-2HB00-0BA4 <br/>LOGO! 230 Rco 6ED1052-2FB00-0BA4 <br/>数字量扩展模块 LOGO! DM 8 12/24R 6ED1055-1MB00-0BA1 <br/>LOGO! DM 8 24 6ED1055-1CB00-0BA0 <br/>LOGO! DM 8 24R 6ED1055-1HB00-0BA0 <br/>LOGO! DM 8 230R 6ED1055-1FB00-0BA1 <br/>LOGO! DM 16 24   6ED1055-1CB10-0BA0 <br/>LOGO! DM 16 24R   6ED1055-1NB10-0BA0 <br/>LOGO! DM 16 230R   6ED1055-1FB10-0BA0 <br/>模拟量扩展模块 LOGO! AM 2 6ED1055-1MA00-0BA0 <br/>LOGO! AM 2 PT100 6ED1055-1MD00-0BA0 <br/>通讯模块 LOGO! AS-I 3RK1400-0CE10-0AA2 <br/>LOGO! KNX (Instabus EIB) 6BK1700-0BA00-0AA0 <br/>LOGO!轻松软件 LOGO! Soft Comfort V4.0 6ED1058-0BA00-0YA0 <br/>LOGO! Soft Comfort V4.0 Upgrade 6ED1058-0CA00-0YE0 <br/>程序存储模块卡 LOGO! Card 6ED1056-5CA00-0BA0 <br/>LOGO!接触器 LOGO! Contact 24V 6ED1057-4CA00-0AA0 <br/>LOGO! Contact 230V 6ED1057-4EA00-0AA0 <br/>LOGO!电源 LOGO!Power 12V/1.9A 6EP1321-1SH02 <br/>LOGO!Power 12V/4.5A 6EP1322-1SH02 <br/>LOGO!Power 24V/1.3A 6EP1331-1SH02 <br/>LOGO!Power 24V/2.5A 6EP1332-1SH42 <br/>LOGO! PC电缆 LOGO! PC Cable 6ED1057-1AA00-0BA0 <br/> <br/>]]></description>
		</item>
		
			<item>
			<link>http://www.hprj.com/default.asp?id=23</link>
			<title><![CDATA[plc术语解释]]></title>
			<author>admin@hprj.com(admin)</author>
			<category><![CDATA[工控文章]]></category>
			<pubDate>Thu,27 Jul 2006 23:29:21 +0800</pubDate>
			<guid>http://www.hprj.com/default.asp?id=23</guid>	
		<description><![CDATA[PLC英文全称Programmable Logic Controller ,中文全称为可编程逻辑控制器，定义是:一种数字运算操作的电子系统，专为在工业环境应用而设计的。它采用一类可编程的存储器，用于其内部存储程序，执行逻辑运算,顺序控制，定时，计数与算术操作等面向用户的指令，并通过数字或模拟式输入/输出控制各种类型的机械或生产过程.]]></description>
		</item>
		
			<item>
			<link>http://www.hprj.com/default.asp?id=6</link>
			<title><![CDATA[串口通讯中比较常用的函数]]></title>
			<author>admin@hprj.com(admin)</author>
			<category><![CDATA[工控文章]]></category>
			<pubDate>Tue,25 Jul 2006 17:08:53 +0800</pubDate>
			<guid>http://www.hprj.com/default.asp?id=6</guid>	
		<description><![CDATA[分享几个自己在处理串口通讯中比较常用的函数，有兴趣的可以看看，给初学者参考下： <br/><br/><br/> function StrToHexStr(const S:string):string;<br/><br/><br/>//字符串转换成16进制字符串<br/><br/><br/>var<br/><br/><br/>  I:Integer;<br/><br/><br/>begin<br/><br/><br/>  for I:=1 to Length(S) do<br/><br/><br/>  begin<br/><br/><br/>    if I=1 then<br/><br/><br/>      Result:=IntToHex(Ord(S[1]),2)<br/><br/><br/>    else Result:=Result+&#39; &#39;+IntToHex(Ord(S[I]),2);<br/><br/><br/>  end;<br/><br/><br/>end;<br/><br/><br/><br/><br/>function HexStrToStr(const S:string):string;<br/><br/><br/>//16进制字符串转换成字符串<br/><br/><br/>var<br/><br/><br/>  t:Integer;<br/><br/><br/>  ts:string;<br/><br/><br/>  M,Code:Integer;<br/><br/><br/>begin<br/><br/><br/>  t:=1;<br/><br/><br/>  Result:=&#39;&#39;;<br/><br/><br/>  while t&lt;=Length(S) do<br/><br/><br/>  begin<br/><br/><br/>    while not (S[t] in [&#39;0&#39;..&#39;9&#39;,&#39;A&#39;..&#39;F&#39;,&#39;a&#39;..&#39;f&#39;]) do<br/><br/><br/>      inc(t);<br/><br/><br/>    if (t+1&gt;Length(S))or(not (S[t+1] in [&#39;0&#39;..&#39;9&#39;,&#39;A&#39;..&#39;F&#39;,&#39;a&#39;..&#39;f&#39;])) then<br/><br/><br/>      ts:=&#39;$&#39;+S[t]<br/><br/><br/>    else<br/><br/><br/>      ts:=&#39;$&#39;+S[t]+S[t+1];<br/><br/><br/>    Val(ts,M,Code);<br/><br/><br/>    if Code=0 then<br/><br/><br/>      Result:=Result+Chr(M);<br/><br/><br/>    inc(t,2);<br/><br/><br/>  end;<br/><br/><br/>end;<br/><br/><br/><br/><br/>function StrToTenStr(const S:string):string;<br/><br/><br/>//字符串转换成10进制字符串<br/><br/><br/>var<br/><br/><br/>  I:Integer;<br/><br/><br/>begin<br/><br/><br/>  for I:=1 to Length(S) do<br/><br/><br/>  begin<br/><br/><br/>    if I=1 then<br/><br/><br/>      Result:=IntTostr(Ord(S[1]))<br/><br/><br/>    else Result:=Result+&#39; &#39;+IntToStr(Ord(S[I]));<br/><br/><br/>  end;<br/><br/><br/>end;<br/><br/><br/><br/><br/>function StrToByteArray(const S:string):TarrayByte;<br/><br/><br/>//字符串转换成相应Byte<br/><br/><br/>var<br/><br/><br/>  I:Integer;<br/><br/><br/>begin<br/><br/><br/>  SetLength(Result,Length(S));<br/><br/><br/>  for I:=1 to Length(S) do<br/><br/><br/>    Result[I-1]:=Ord(S[I]);<br/><br/><br/>end;<br/><br/><br/><br/><br/>function ByteArrayToStr(const aB:TarrayByte):string;//Byte转换成相应字符串<br/><br/><br/>var<br/><br/><br/>  I:Integer;<br/><br/><br/>begin<br/><br/><br/>  SetLength(Result,High(aB)+1);<br/><br/><br/>  for I:=0 to High(aB) do<br/><br/><br/>    Result[I+1]:=Chr(aB[I]);<br/><br/><br/>end;<br/><br/><br/><br/><br/>function StrToBcdByteArray(const S:string; const Rotate:Boolean=False):TarrayByte; //字符串转换成相应BCDByte<br/><br/><br/>var<br/><br/><br/>  ts:string;<br/><br/><br/>  I:Integer;<br/><br/><br/>begin<br/><br/><br/>  if Odd(Length(S)) then<br/><br/><br/>    ts:=&#39;0&#39;+S<br/><br/><br/>  else ts:=S;<br/><br/><br/>  SetLength(Result,Length(ts) div 2);<br/><br/><br/>  for I:=0 to High(Result) do<br/><br/><br/>  begin<br/><br/><br/>    if Rotate then<br/><br/><br/>      Result[High(Result)-I]:=StrToInt(&#39;$&#39;+ts[2*I+1]+ts[2*I+2])<br/><br/><br/>    else<br/><br/><br/>      Result[I]:=StrToInt(&#39;$&#39;+ts[2*I+1]+ts[2*I+2]);<br/><br/><br/>  end;<br/><br/><br/>end;<br/><br/><br/><br/><br/>function BcdByteArrayToStr(const aNum:TarrayByte; const Rotate:Boolean=False):string; //BCDByte转换成相应字符串<br/><br/><br/>var<br/><br/><br/>  I:Integer;<br/><br/><br/>  t:string;<br/><br/><br/>begin<br/><br/><br/>  SetLength(Result,2*(High(aNum)+1));<br/><br/><br/>  for I:=0 to High(aNum) do<br/><br/><br/>  begin<br/><br/><br/>    t:=IntToHex(aNum[I],2);<br/><br/><br/>    if Rotate then<br/><br/><br/>    begin<br/><br/><br/>      Result[2*(High(aNum)-I)+1]:=t[1];<br/><br/><br/>      Result[2*(High(aNum)-I)+2]:=t[2];<br/><br/><br/>    end<br/><br/><br/>    else begin<br/><br/><br/>      Result[2*I+1]:=t[1];<br/><br/><br/>      Result[2*I+2]:=t[2];<br/><br/><br/>    end;<br/><br/><br/>  end;<br/><br/><br/>end;<br/><br/><br/><br/><br/>//集合形式转换成数组<br/><br/><br/>function SetToByteArray(s:array of const):TarrayByte;<br/><br/><br/>var<br/><br/><br/>  I:Byte;<br/><br/><br/>begin<br/><br/><br/>  SetLength(Result,High(s)+1);<br/><br/><br/>  for I:=0 to High(s) do<br/><br/><br/>    Result[I]:=S[I].VInteger;<br/><br/><br/>end;<br/><br/><br/><br/><br/>function SetToWordArray(s:array of const):TarrayWord;<br/><br/><br/>var<br/><br/><br/>  I:Byte;<br/><br/><br/>begin<br/><br/><br/>  SetLength(Result,High(s)+1);<br/><br/><br/>  for I:=0 to High(s) do<br/><br/><br/>    Result[I]:=S[I].VInteger;<br/><br/><br/>end;<br/><br/><br/><br/><br/>function StrToBinStr(const S:string):string;<br/><br/><br/>//字符串转换为2进制字符串<br/><br/><br/>var<br/><br/><br/>  I:Integer;<br/><br/><br/>begin<br/><br/><br/>  Result:=&#39;&#39;;<br/><br/><br/>  for I:=1 to Length(S) do<br/><br/><br/>  begin<br/><br/><br/>    if I=1 then<br/><br/><br/>      Result:=BinStrArray[Ord(S[1])]<br/><br/><br/>    else Result:=Result+&#39; &#39;+BinStrArray[Ord(S[I])];<br/><br/><br/>  end;<br/><br/><br/>end;<br/><br/><br/><br/><br/>function ByteToBinStr(const B:Byte):string;<br/><br/><br/>//Byte型转换为二进制字符串<br/><br/><br/>var<br/><br/><br/>  I:Integer;<br/><br/><br/>begin<br/><br/><br/>  Result:=&#39;&#39;;<br/><br/><br/>  for I:=7 downto 0 do<br/><br/><br/>    Result:=Result+Chr(((B shr I) and 1)+48);<br/><br/><br/>end;<br/><br/><br/><br/><br/>function BinStrToByte(const S:string):Byte;<br/><br/><br/>//二进制字符串转成数字<br/><br/><br/>var<br/><br/><br/>  S1:string[8];<br/><br/><br/>  L:Integer;<br/><br/><br/>  I:Integer;<br/><br/><br/>begin<br/><br/><br/>  S1:=&#39;00000000&#39;;<br/><br/><br/>  L:=min(8,Length(S));<br/><br/><br/>  for I:=L downto 1 do<br/><br/><br/>    if S[I]=&#39;1&#39; then<br/><br/><br/>      S1[8+I-L]:=S[I]<br/><br/><br/>    else<br/><br/><br/>      S1[8+I-L]:=&#39;0&#39;;<br/><br/><br/>  Result:=0;<br/><br/><br/>  for I:=0 to 7 do<br/><br/><br/>    Result:=Result+(((Ord(S1[I+1])-48) shl (7-I)));<br/><br/><br/>end;<br/><br/><br/><br/><br/>function T2ByteToWord(const T:T2Byte;const LowFront:Boolean=False):Word;<br/><br/><br/>//T2Byte类型转换成Word类型<br/><br/><br/>var<br/><br/><br/>  a1,a2:Byte;<br/><br/><br/>begin<br/><br/><br/>  if LowFront then<br/><br/><br/>  begin<br/><br/><br/>    a1:=T[1];<br/><br/><br/>    a2:=T[0];<br/><br/><br/>  end<br/><br/><br/>  else begin<br/><br/><br/>    a1:=T[0];<br/><br/><br/>    a2:=T[1];<br/><br/><br/>  end;<br/><br/><br/>  Result:=a1;<br/><br/><br/>  Result:=(Result shl 8) + a2;<br/><br/><br/>end;<br/><br/><br/><br/><br/>function WordToT2Byte(const aNum:Word;const LowFront:Boolean=False):T2Byte;//Word类型转换成T2Byte类型<br/><br/><br/>var<br/><br/><br/>  a1,a2:Byte;<br/><br/><br/>begin<br/><br/><br/>  a1:=aNum;<br/><br/><br/>  a2:=aNum shr 8;<br/><br/><br/>  if LowFront then<br/><br/><br/>  begin<br/><br/><br/>    Result[0]:=a1;<br/><br/><br/>    Result[1]:=a2;<br/><br/><br/>  end<br/><br/><br/>  else begin<br/><br/><br/>    Result[0]:=a2;<br/><br/><br/>    Result[1]:=a1;<br/><br/><br/>  end;<br/><br/><br/>end;<br/><br/><br/><br/><br/>function ByteToBCDByte(const B:Byte;const aType:TBCDType=bt8421):Byte;<br/><br/><br/>//Byte转换成BCD码<br/><br/><br/>var<br/><br/><br/>  B1,B2:Byte;<br/><br/><br/>  function T2421(const P:Byte):Byte;<br/><br/><br/>  begin<br/><br/><br/>    if P&lt;5 then<br/><br/><br/>      Result:=P<br/><br/><br/>    else Result:=P+6;<br/><br/><br/>  end;<br/><br/><br/>begin<br/><br/><br/>  if B&gt;99 then<br/><br/><br/>    Result:=0<br/><br/><br/>  else begin<br/><br/><br/>    B1:=B div 10;<br/><br/><br/>    B2:=B mod 10;<br/><br/><br/>    case aType of<br/><br/><br/>      bt8421:begin<br/><br/><br/>        Result:=(B1 shl 4)+B2;<br/><br/><br/>      end;<br/><br/><br/>      bt2421:begin<br/><br/><br/>        Result:=(T2421(B1) shl 4)+T2421(B2);<br/><br/><br/>      end;<br/><br/><br/>      btR3:begin<br/><br/><br/>        Result:=((B1+3) shl 4)+(B2+3)<br/><br/><br/>      end;<br/><br/><br/>      else Result:=(B1 shl 4)+B2;<br/><br/><br/>    end;<br/><br/><br/>  end;<br/><br/><br/>end;<br/><br/><br/><br/><br/>function BCDByteToByte(const B:Byte;const aType:TBCDType=bt8421):Byte;<br/><br/><br/>//BCD转成Byte型<br/><br/><br/>var<br/><br/><br/>  B1,B2:Byte;<br/><br/><br/>  function Ts2421(const P:Byte):Byte;<br/><br/><br/>  begin<br/><br/><br/>    if P&lt;5 then<br/><br/><br/>      Result:=P<br/><br/><br/>    else Result:=P-6;<br/><br/><br/>  end;<br/><br/><br/>begin<br/><br/><br/>  B1:=(B and $F0) shr 4;<br/><br/><br/>  B2:=B and $0F;<br/><br/><br/>  case aType of<br/><br/><br/>    bt8421: begin<br/><br/><br/>      Result:=B1*10+B2;<br/><br/><br/>    end;<br/><br/><br/>    bt2421: begin<br/><br/><br/>      Result:=(Ts2421(B1)*10)+Ts2421(B2);<br/><br/><br/>    end;<br/><br/><br/>    btR3: begin<br/><br/><br/>      Result:=((B1-3)*10)+(B2-3)<br/><br/><br/>    end;<br/><br/><br/>    else Result:=B1*10+B2;<br/><br/><br/>  end;<br/><br/><br/>end;<br/><br/><br/><br/><br/>function BCDByteToByteFF(const B:Byte;Auto:Boolean=True):Byte;<br/><br/><br/>//BCD转成Byte型 FF--&gt;FF 8421码<br/><br/><br/>var<br/><br/><br/>  B1,B2:Byte;<br/><br/><br/>begin<br/><br/><br/>  if (B=$FF)or(Auto and (B&gt;=$AA)) then<br/><br/><br/>    Result:=B<br/><br/><br/>  else begin<br/><br/><br/>    B1:=(B and $F0) shr 4;<br/><br/><br/>    B2:=B and $0F;<br/><br/><br/>    Result:=B1*10+B2;<br/><br/><br/>  end;<br/><br/><br/>end;<br/><br/><br/><br/><br/>function ByteToBCDByteFF(const B:Byte;Auto:Boolean=True):Byte;<br/><br/><br/>//Byte转换成BCD码 FF--&gt;FF 8421码<br/><br/><br/>var<br/><br/><br/>  B1,B2:Byte;<br/><br/><br/>begin<br/><br/><br/>  if (B=$FF)or(Auto and (B&gt;=$AA)) then<br/><br/><br/>    Result:=B<br/><br/><br/>  else if B&gt;99 then<br/><br/><br/>    Result:=0<br/><br/><br/>  else begin<br/><br/><br/>    B1:=B div 10;<br/><br/><br/>    B2:=B mod 10;<br/><br/><br/>    Result:=(B1 shl 4)+B2;<br/><br/><br/>  end;<br/><br/><br/>end;]]></description>
		</item>
		
			<item>
			<link>http://www.hprj.com/default.asp?id=5</link>
			<title><![CDATA[MSComm控件的属性]]></title>
			<author>admin@hprj.com(admin)</author>
			<category><![CDATA[工控文章]]></category>
			<pubDate>Tue,25 Jul 2006 17:06:30 +0800</pubDate>
			<guid>http://www.hprj.com/default.asp?id=5</guid>	
		<description><![CDATA[MSComm控件的属性<br/>(必须要熟悉的几个——CommPort：设置并返回通信端口号；Setting：以字符串的形式设置并返回数据传输速率、奇偶校验、数据比特、停止比特；PortOpen：设置并返回通信端口的状态，也可以打开和关闭端口；Input：从接收缓冲区返回和删除字符；Output：向传输缓冲区定一个字符串)<br/>1)CommPort属性<br/>void SetCommPort(short nNewValue); short GetCommPort();<br/>这一属性设置并返回连接的串行端口号，Windows将会利用该串口和外界通信。在设计时，nNewValue可以设置成从1~16的任何数(默认值为1)。但是如果用PortOpen属性打开一个并不存在的端口时，MSComm控件会产生错误68(设备无效)。<br/>注意：必须在打开端口之前设置CommPort属性。<br/>2)Settings属性<br/>void Settings(LPCTSTR lpszNewValue); String GetSettings();<br/>该属性用于设置并返回数据传输速率、奇偶校验、数据比特、停止比特参数。当端口打开时，如果value非法，则MSComm控件产生错误380(非法属性值)。其中lpszNewValue用字符串表示，由四个设置值组成，有如下的组成格式：<br/>“BBBB,P,D,S”<br/>BBBB为数据传输速率，P为奇偶校验，D为数据比特，S为停止比特。Value的默认值是：“9600,N,8,1”，数据传输速率合法值可以是110、300、600、1200、2400、4800、9600、14400、19200、28800、38400、56000、57600、115200、12800、25600。<br/>奇偶校验值可以是设置为下表的任一值。<br/>设定值 描述<br/>E 偶校验(EVEN)<br/>M 标号校验(MARK)<br/>N 无校验(NONE)<br/>O 奇校验(ODD)<br/>S 空格校验(SPACE)<br/>数据比特数可以是4、5、6、7、8。<br/>停止比特数可以是1、1.5、2。<br/>注意：只有当通信的双方的Settings属性值都一样时，通信连接才能生效。<br/>3)Handshaking属性<br/>这一属性用于设置或者返回硬件握手协议，也就是PC和通信设备之间为了控制流速而设定的内部协议。属性值可以设置为下表中的任一个。<br/><br/>设定值 值 描述<br/>ComNone 0 默认值，无握手协议<br/>comXOnXOff 1 XON/XOFF握手<br/>ComRTS 2 RTS/CTS握手<br/>comRtsXOnXOff 3 RTS/CTS和XON/XOFF握手皆可<br/>4)RThreshold属性<br/>void SetRThreshold(short nNewValue); short GetRThreshold();<br/>在MSComm控件设置CommEvent属性为comEvReceive并产生OnComm之前，RThreshold属性设置并返回的要接收的字符数。这里nNewValue是short型参数，说明在产生OnComm事件之前要接收的字符数。<br/>当接收字符后，若RThreshold属性设置为0(默认值)则不会产生OnComm事件。否则，该属性为一阈值，当接收缓冲区内字节个数达到或超过该值后就会产生OnComm事件，例如，设置RThreshold为1，接收缓冲区收到每一个字符都会使MSComm控件产生OnComm事件。<br/>5)CTSHolding属性<br/>void SetCTSHolding(BOOL bNewValue); BOOL GetCTSHolding();<br/>其属性设定值如下表所示。<br/>设定值 功能描述<br/>TRUE CTS线为高电平<br/>FALSE CTS线为低电平<br/>该属性确定是否可通过查询CTS线的状态发送数据。CTS是调制解调器发送到相连计算机的信号，指示传输可以进行。该属性在设计时无效，在运行时为只读。<br/>如果CTS线为低电平(CTSHolding = FALSE)并且超时时，MSComm控件设置CommEvent属性为comEventCTSTO(Clear To Send Timeout)并产生OnComm事伯。CTS线用于RTS/CTS硬件握手。如果需要确定CTS线的状态，CTSHolding属性给出一种手工查询方法。<br/>6)SThreshold属性<br/>void SetSThreshold(short nNewValue); short GetSThreshold();<br/>MSComm控件设置CommEvent属性为comEvSend并产生OnComm事件之前，设置并返回传输缓冲区中允许的最小字符数。这里nNewValue是short型数据，代表在OnComm事件产生之前在传输缓冲区中的最小字符数。<br/>若设置Sthreshold属性为0(默认值)，数据传输事件不会产生OnComm事件。若设置Sthreshold属性为0，当传输缓冲区完全空时，MSComm控件产生OnComm事件。如果在传输缓冲区的字符数小于value，CommEvent属性设置为comEvSend，并产生OnComm事件。comEvSend事件仅当字符数与Sthreshold交叉时被激活一次。例如，如果Sthreshold等于5，仅当在输出队列中字符数从5降到4时，comEvSend才发生。如果在输出队列中从没有比Sthreshold多的字符，comEvSend事件将绝不会发生。<br/>7)InputMode属性<br/>void SetInputMode(long nNewValue); long GetInputMode();<br/>访属性用于设置或者返回传输数据的类型。其取值和基本含义如下表所示。<br/>设定值 值 描述<br/>ComInputModeText(缺省) 0 通过Input属性以文本方式取回数据<br/>ComInputModeBinary 1 通过Input属性以二进制方式取回数据<br/><br/>8)InputLen属性<br/>void SetInputLen(short nNewValue); short GetInputLen ();<br/>该属性用于设置并返回Input属性从接收缓冲区读取的字符数。nNewValue是short型数值，说明Input属性从接收缓冲区中读取的字符数。<br/>InputLen属性的默认值是0。当设置InputLen为0时，使用Input将使MSComm控件读取接收缓冲区中全部的内容。若接收缓冲区中InputLen字符无效，Input属性返回一个零长度字符串(“”)。在使用Input前，用户可以选择检查InBufferCount属性来确定缓冲区中是否已有需要数目的字符。该属性在从输出格式为定长数据的机器读取数据时非常有用。<br/>9)InBuffersize属性<br/>void SetBufferSize(short nNewValue); short GetInBufferSize();<br/>InBuffersize属性用于设置或返回输入缓冲区的大小，默认值为1024字节。<br/>10)InBufferCount属性<br/>void SetInBufferCount(short nNewValue); short GetInBufferCount();<br/>InBufferCount属性用于返回输入缓冲区内的等待读取的字节个数，可以通过该属性值为0来清除接收缓冲区。<br/>11)Input属性<br/>VARIANT GetInput();<br/>Input属性表示从接收缓冲区移走一串字符，将缓冲区中收到的数据读入变量。属性值为VARIAN型变量。该属性在端口未打开时不可用，在运行时是只读的。<br/>注意：当InputMode属性值 为0时(文本模式)，变量中含String型数据。当InputMode属性值为1(二进制模式)，变量中含Byte型数组数据。<br/>12)PortOpen属性<br/>void SetPortOpen(BOOL bNewValue); BOOL GetPortOpen();<br/>PortOpen属性用于打开或者关闭端口。如果bNewValue设为TRUE，可以打开端口；设为FALSE时可以关闭端口。一般情况下在程序开始时打开端口，在程序结束时关闭端口。当应用程序终止时，MSComm控件将自动关闭串口。在打开端口前，确定CommPort属性调协为正确的端口号。而且，用户的串口设备必须支持Settings属性中的设置。如果硬件设备不支持Settings属性中的一些设置，则硬件工作或许不正确。<br/>13)OutBuffersize属性<br/>void SetOutBufferSize(short nNewValue);<br/>OutBuffersize属性用于设置或者返回发送缓冲区的大小，值为整形表达式，表示传输缓冲区的字节数，默认值为512字节。对发送缓冲区设置得越大，应用程序可以使用的内存就越小。然而，如果发送缓冲区太小，缓冲区将会溢出，除非使用握手协议。<br/>14)OutBufferCounter属性<br/>void SetOutBufferSize(short nNewValue); short GetOutBufferSize();<br/>OutBufferCounter属性用于返回发送缓冲区内等待发送的字节数，可以通过设置该属性为0来清空发送缓冲区。<br/>15)Output属性<br/>void SetOutput(const VARIANT &amp; newValue);<br/>Output属性用于向发送缓冲区写数据流。属性为VARIANT变量。该属性在端口未打开时不可用，在运行时只是写的。<br/>注意：Output属性可以发送文本数据或二进制数据。传输文本数据时，应该将字符型 数据放入VARIANT变量中；传输二进制数据(即按字节传送)时，应将字节型数据放入VARIANT型变量中。如果通常给应用程序发送ANSI字符串，可以以文本方式发送。如果数据包含了内嵌控制字符、NULL字符等，必须将其作为二进制传递过去。<br/>16)CommEvent属性<br/>short GetCommEvent();<br/>如果在通信过程中发生错误或事件，将会引发OnComm事件并且改变其属性值。CommEvent属性值反映错误或者事件类型，通信的设计中可以根据该属性值执行同的操作。该属性在端口未打开时不可用，在运行时是只读的。通信错误及通信事件的设定值分别如下两表所示。<br/>通信错误设定值<br/>设定值 值 描述<br/>comEventBreak 1001 接收到中断信号<br/>comEventCTSTO 1002 CTS超时<br/>comEventDSRTO 1003 DSR超时<br/>comEventFrame 1004 帧错误，硬件检测到一个帧出错，双方设置的格式不一致时，就会引发此错误<br/>comEventOverrun 1006 端口超速。一个字符没有在下一个字符到达之前被硬件读取，该字符丢失<br/>comEventCDTO 1007 数据检测超时<br/>comEventRxOver 1008 接收缓冲区溢出<br/>comEventRxParity 1009 奇偶校验错误<br/>comEventTxFull 1010 传输缓冲区溢出，表明输出缓冲区已满，不能再将字符输出到缓冲区<br/>comEventDCB 1011 检索端口、设备控制块(DCB)时的意外错误<br/><br/>通信事件设定值<br/>设定值 值 描述<br/>comEvSend 1 发送事件。发送缓冲区的内容少于SThreshold指定的值<br/>comEvReceive 2 接收事件。接收缓冲区内字符数达到RThreshold值，该事件在缓冲区内数据被移走前将持续产生，利用此事件可编写接收数据的过程<br/>comEvCTS 3 CTS线变化<br/>comEvDSR 4 DSR线变化<br/>comEvCD 5 CD线变化<br/>comEvRing 6 振铃检测<br/>comEvEOF 7 文件结束。接收数据中出现文件结束(ASCII 码26)字符<br/><br/>17)DTREnable属性<br/>void SetDTREnable(BOOL bNewValue); BOOL GetDTREnable();<br/>DTREnable属性确定在通信时是否使用DTR线有效，DTR是计算机发送到调制解调器的信号，表明计算机在等待数据传输。<br/>18)RTSEnable属性<br/>void SetRTSEnable(BOOL bNewValue); BOOL GetRTSEnable();<br/>RTSEnable属性确定是否使用RTS线有效。一般情况下，由计算机发送RTS信号到连接的调制解调器，请求允许发送数据。<br/>19)EOFEnable属性<br/>void SetEOFEnable(BOOL bNewValue); BOOL GetEOFEnable();<br/>EOFEnable属性确定在输入过程中MSComm控件是否寻找文件结尾(EOF)字符。如果找到EOF字符，将停止输入并激活OnComm事件，此时CommEvent属性设置为comEvEOF，这里bNewValue为布尔表达式，确定当找到EOF字符时，OnComm事件是否被激活。当bNewValue的设置值TRUE时，EOF字符找到时OnComm事件被激活。否则当VALUE值设为FALSE(默认)时，EOF字符找到时OnComm事件不被激活。<br/>注意：当EOFEnable属性设置为FALSE时，OnComm控件将不在输入流中寻找EOF字符。<br/>20)CDHolding属性<br/>void SetCDHolding(BOOL bNewValue); BOOL GetCDHolding();<br/>通过查询CD线的状态确定当前是否有传输。CD是从调制解调器发送到相连计算机的一个信号，指示调制解调器正在联机。该属性在设计时无效，在运行时为只读。属性的设置值为：当bNewValue为TRUE时，CD线为高电平；当bNewValue为FALSE时，CD线为低电平。注意当CD线为高电平(CDHolding=TRUE)且超时时，MSComm控件设置CommEvent属性为comEventCDTO(CD超时错误)，并产生OnComm事件。<br/>注意：在主机应用程序中捕获一个丢失的传输是特别重要的，例如一个公告板，因为呼叫者可以随时挂起(放弃传输)。CD也被称为Receive Line Signal Detect(RLSD)。<br/>21)DSRHolding属性<br/>void SetDSRHolding(BOOL bNewValue); BOOL GetDSRHolding();<br/>确定DSR线的状态。DSR信号由调制解调器发送到相连计算机，指示作好操作准备。该属性在设计时无效，在运行时为只读。DSRHolding属性返回为TRUE时，表示DSR线高，返回FALSE时，表示DSR线低。当DSR线为高电平时(DSRHolding=TRUE)超时时，MSComm控件设置CommEvent属性为comEventDSRTO(数据准备超时)并产生OnComm事件。当为DTE(Data Terminal Equipment)机器写DSR/DTR握手例程时该属性是分有用的。<br/><br/>作者:blindpoint<br/>主页:www.blindpoint.net<br/>注意：有任何问题到www.blindpoint.net/bbs论坛下进行咨询探讨<br/>]]></description>
		</item>
		
			<item>
			<link>http://www.hprj.com/default.asp?id=4</link>
			<title><![CDATA[Delphi+MSComm控件串口收发程序]]></title>
			<author>admin@hprj.com(admin)</author>
			<category><![CDATA[工控文章]]></category>
			<pubDate>Tue,25 Jul 2006 17:04:45 +0800</pubDate>
			<guid>http://www.hprj.com/default.asp?id=4</guid>	
		<description><![CDATA[//Delphi+MSComm控件串口收发程序  <br/>//HotPower@126.com <br/><br/>procedure TForm1.FormCr&#101;ate(Sender: TObject); <br/>begin <br/>  if MSComm1.PortOpen then MSComm1.PortOpen := false;//关闭端口 <br/>  MSComm1.CommPort := 2;//设置端口2 <br/>  MSComm1.InBufferSize := 256;//设置接收缓冲区为256个字节 <br/>  MSComm1.OutBufferSize := 256;//设置发送缓冲区为256个字节 <br/>  MSComm1.Settings := &#39;9600,n,8,1&#39;;//9600波特率，无校验，8位数据位，1位停止位 <br/>  MSComm1.InputLen := 0;//读取缓冲区全部内容(32个字节) <br/>  MSComm1.InBufferCount := 0;// 清除接收缓冲区 <br/>  MSComm1.OutBufferCount:=0;// 清除发送缓冲区 <br/>  MSComm1.RThreshold := 32;//设置接收32个字节产生OnComm 事件 <br/>//  MSComm1.InputMode := comInputModeText;//文本方式 <br/>  MSComm1.InputMode := comInputModeBinary;//二进制方式 <br/>  MSComm1.PortOpen := true;//打开端口 <br/>end; <br/><br/>procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean); <br/>begin <br/>  if MSComm1.PortOpen then MSComm1.PortOpen := false;;//关闭端口 <br/>end; <br/><br/>procedure TForm1.MSComm1Comm(Sender: TObject); <br/>var <br/>  buffer: Olevariant;//MSComm1.InputMode = comInputModeBinary <br/>  str: string;//MSComm1.InputMode = comInputModeText <br/>  i: integer; <br/>begin <br/>  case MSComm1.CommEvent of <br/>    comEvReceive: //串行接收事件处理 <br/>      begin <br/>        if MSComm1.InputMode = comInputModeText then //字符方式读取 <br/>          str := MSComm1.Input//读出后会自动清除接收缓冲区,str[1]~str[32] <br/>        else //二进制方式读取 <br/>          buffer := MSComm1.Input;//读出后会自动清除接收缓冲区,buffer[0]~buffer[31] <br/>        Edit3.Text := &#39;&#39;; <br/>        for i := 0 to MSComm1.RThreshold - 1 do //32字节Hex转换 <br/>        begin <br/>          if MSComm1.InputMode = comInputModeText then //单行字符转换 <br/>            Edit3.Text := Edit3.Text + inttohex(byte(str[i + 1]), 2) + &#39; &#39; <br/>          else //单行二进制数据转换 <br/>            Edit3.Text := Edit3.Text + inttohex(buffer[i], 2) + &#39; &#39;; <br/>        end; <br/>        Memo2.Lines.Add(Edit3.Text);//加入一行显示 <br/>      end; <br/>  end; <br/>end; <br/><br/>procedure TForm1.BitBtn1Click(Sender: TObject); <br/>var <br/>  i: integer; <br/>begin <br/>  Edit4.Text := &#39;&#39;; <br/>  for i := 0 to 31 do <br/>  begin <br/>    MSComm1.Output := char(i);//发送一个字符 <br/>    Edit4.Text := Edit4.Text + inttohex(i, 2);//以十六进制字符显示 <br/>  end; <br/>  Memo1.Lines.Add(Edit4.Text);//加入一行显示 <br/><br/>end; <br/>]]></description>
		</item>
		
			<item>
			<link>http://www.hprj.com/default.asp?id=2</link>
			<title><![CDATA[西门子S7-200 PLC之PPI协议]]></title>
			<author>admin@hprj.com(admin)</author>
			<category><![CDATA[工控文章]]></category>
			<pubDate>Tue,25 Jul 2006 16:38:08 +0800</pubDate>
			<guid>http://www.hprj.com/default.asp?id=2</guid>	
		<description><![CDATA[通过硬件和软件侦听的方法，分析PLC内部固有的PPI通讯协议，然后上位机采用VB编程，遵循PPI通讯协议，读写PLC数据，实现人机操作任务。这种通讯方法，与一般的自由通讯协议相比，省略了PLC的通讯程序编写，只需编写上位机的通讯程序资源 <br/>S7-226的编程口物理层为RS-485结构，SIEMENS提供MicroWin软件，采用的是PPI(Point to Point)协议，可以用来传输、调试PLC程序。在现场应用中，当需要PLC与上位机通讯时，较多的使用自定义协议与上位机通讯。在这种通讯方式中，需要编程者首先定义自己的自由通讯格式，在PLC中编写代码，利用中断方式控制通讯端口的数据收发。采用这种方式，PLC编程调试较为烦琐，占用PLC的软件中断和代码资源，而且当PLC的通讯口定义为自由通讯口时，PLC的编程软件无法对PLC进行监控，给PLC程序调试带来不便。<br/>SIEMENS S7-200PLC的编程通讯接口，内部固化的通讯协议为PPI协议，如果上位机遵循PPI协议来读写PLC，就可以省略编写PLC的通讯代码。如何获得PPI协议？可以在PLC的编程软件读写PLC数据时，利用第三个串口侦听PLC的通讯数据，或者利用软件方法，截取已经打开且正在通讯的端口的数据，然后归纳总结，解析出PPI协议的数据读写报文。这样，上位机遵循PPI协议，就可以便利的读写PLC内部的数据，实现上位机的人机操作功能。<br/>软件设计<br/>系统中测控任务由SIEMENS S7-226PLC完成，PLC采用循环扫描方式工作，当定时时间到时，执行数据采集或PID控制任务，完成现场的信号控制。计算机的监控软件采用VB编制，利用MSComm控件完成串口数据通讯，通讯遵循的协议为PPI协议。<br/>PPI协议<br/>西门子的PPI（Point to Point）通讯协议采用主从式的通讯方式，一次读写操作的步骤包括：首先上位机发出读写命令，PLC作出接收正确的响应，上位机接到此响应则发出确认申请命令，PLC则完成正确的读写响应，回应给上位机数据。这样收发两次数据，完成一次数据的读写[5]。<br/>其通讯数据报文格式大致有以下几类：<br/>1、读写申请的数据格式如下：<br/><br/>SD LE LER SD DA SA FC DASP SSAP DU FCS ED <br/>SD:(Start Delimiter)开始定界符(68H)<br/>LE:（Length）报文数据长度<br/>LER:（Repeated Length）重复数据长度<br/>SD: (Start Delimiter)开始定界符(68H)<br/>SA:（Source Address）源地址，指该地址的指针，为地址值乘以8<br/>DA:（Destination Address）目标地址，指该地址的指针，为地址值乘以8<br/>FC:（Function Code）功能码<br/>DSAP:（Destination Service Access Point）目的服务存取点<br/>SSAP:（Source Service Access Point）源服务存取点<br/>DU:（Data Unit）数据单元<br/>FCS:（Frame Check Sequence）校验码<br/>ED:（End Delimiter）结束分界符（16H）<br/>报文数据长度和重复数据长度为自DA至DU的数据长度，校验码为DA至DU数据的和校验，只取其中的末字节值。<br/>在读写PLC的变量数据中，读数据的功能码为 6CH，写数据的功能码为 7CH。<br/>2、PLC接收到读写命令，校验后正确，返回的数据格式为 E5H<br/>3、确认读写命令的数据格式为：<br/><br/>SD SA DA FC FCS ED <br/>其中SD为起始符，为10H<br/>SA为数据源地址<br/>DA为目的地址<br/>FC为功能码，取5CH<br/>FCS为SA+DA+FC的和的末字节<br/>ED为结束符，取16H<br/>PPI协议的软件编制<br/>在采用上位机与PLC通讯时，上位机采用VB编程，计算机采用PPI电缆或普通的485串口卡与PLC的编程口连接，通讯系统采用主从结构，上位机遵循PPI协议格式，发出读写申请，PLC返回相应的数据。程序实现如下：<br/>1、串口初始化程序：<br/>MSComm1.CommPort = 1<br/>MSComm1.Settings = &#34;9600,e,8,1&#34;<br/>MSComm1.InputLen = 0<br/>MSComm1.RThreshold = 1<br/>MSComm1.InputMode = comInputModeBinary<br/>PPI协议定义串口为以二进制形式收发数据，这样报文的通讯效率比ASCII码高。<br/>2、串口读取数据程序，以读取VB100数据单元为例：<br/>Dim Str_Read(0 To 32) ‘定义发送的数据为字节为元素的数组。<br/>Str_ Read (32) = &amp;H16 ‘相应的数组元素赋值，按照以下格式：<br/>Str_ Read (29) = (100*8) \ 256 ‘地址为指针值，先取高位地址指针<br/>Str_ Read (30) = (100*8) Mod 256 ‘取低位地址指针<br/>Str_ Read (24) = 1 ‘读取的数据长度（Byte的个数）<br/>For I=4 to 30<br/>Temp_FCS = Temp_FCS + Str_Read(i)<br/>Next I<br/>Str_Read(31)= Temp_FCS Mod 256 ‘计算FCS校验码，其它数组元素赋值省略。<br/>68 1B 1B 68 2 0 6C 32 1 0 0 0 0 0 E 0 0 4 1 12 A 10 2 0 1 0 1 84 0 3 20 8B 16 <br/>PLC返回数据 E5 后，确认读取命令，发送以下数据：<br/>10 2 0 5C 5E 16<br/>然后上位机VB程序接受到以下数据：<br/>68 16 16 68 0 2 8 32 3 0 0 0 0 0 2 0 5 0 0 4 1 FF 4 0 8 22 78 16<br/>首先识别目标地址和源地址，确认是这次申请的返回数据，然后经过校验检查，正确后解析出第26号数据（&amp;H22）即为VB100字节的数据。<br/>3、串口写入数据程序，以写VB100数据单元为例：<br/>Dim Str_Write(0 To 37) ‘定义发送的数据为字节为元素的数组。<br/>Str_Write (37) = &amp;H16 ‘相应的数组元素赋值，按照以下格式<br/>Str_Write (35) = &amp;H10 ‘要写入的数据值<br/>68 20 20 68 2 0 7C 32 1 0 0 0 0 0 E 0 5 5 1 12 A 10 2 0 1 0 1 84 0 3 20 0 4 0 8 C B9 16 <br/>PLC返回数据 E5 后，确认写入命令，发送以下数据：<br/>10 2 0 5C 5E 16<br/>然后上位机VB程序接受到以下数据：<br/>68 12 12 68 0 2 8 32 3 0 0 0 0 0 2 0 1 0 0 5 1 FF 47 16<br/>这是PLC正确接收并写入信息的返回数据。<br/>4、串口接收程序：<br/>在数据接收程序中，利用VB中MSComm控件，一次接收缓冲区中的全部数据，存放到数组形式的暂存单元中，然后分析每个元素的值，得到读写的数据。<br/>Dim RCV_Array() As Byte<br/>Dim Dis_Array As String<br/>Dim RCV_Len As Long<br/>RCV_Array = MSComm1.Input ‘取出串口接收缓冲器的数据。<br/>RCV_Len = UBound(RCV_Array)<br/>ReDim Temp(0 To UBound(RCV_Array))<br/>For i = 0 To RCV_Len<br/>Dis_Array = Dis_Array &amp; Hex(RCV_Array (i)) &amp; &#34; &#34;<br/>Next i<br/>Text1.Text = Dis_Array ‘接收到的数据送显示。<br/>在程序的读写过程中，一次最大可以读写222个字节，目前给出的数据读写为整数格式。<br/><br/>数据类型 Str_ Read（27） <br/>S 04H <br/>SM 05H <br/>I 81H <br/>Q 82H <br/>M 83H <br/>V 84H <br/>以上程序，是以读写PLC的V变量区为例，利用PPI协议还可以读写S7-200PLC中的各种类型数据，包括I、Q、SM、M、V、T、C、S等数据类型，能够直接读出以上变量中的位、字节、字、双字等，其中读位变量时，是读取该位所在的字节值，然后上位机自动识别出该位的值。按照读写的数据类型，其中Str_ Read（27）的值各不同：<br/>在控制系统中，PLC与上位计算机的通讯，采用了PPI通讯协议，上位机每0.5秒循环读写一次PLC。PLC编程时，将要读取的检测值、输出值等数据，存放在PLC的一个连续的变量区中，当上位机读取PLC的数据时，就可以一次读出这组连续的数据，减少数据的分次频繁读取。当修改设定值等数据时，进行写数据的通讯操作。]]></description>
		</item>
		
</channel>
</rss>