搬家了,新地址:http://hi.baidu.com/6apples欢迎常来转转:)

搬家了,新地址:http://hi.baidu.com/6apples欢迎常来转转:)

搬家了,新地址:http://hi.baidu.com/6apples欢迎常来转转:)

2007年6月3日星期日

解读心情

周末,只一个人在办公室,宁谧意味着低沉,就剩下空调嗡嗡的风声。窗外还是那几栋建筑……建筑,再恢宏的建筑也不过是一个摆设,虽历千载,不识一物。

识物……谁又识呢?大家都在忙碌,我也在忙碌,恍惚间又复一日!热、闷、烦……突然期待一场大雨,冰冷的雨水或可驱散我的恍惚。

桌上的日历好像在记录着什么,不懂,也许到鬓染秋霜时会明白一点。明白了又怎样呢?在自我陶醉中死去,带着满意的微笑?

真想把自己打散,融入清爽的风中,柳絮为伴,遍历川泽。风止……尘埃落定,散布于苍茫大地,冷眼冬夏春秋。一切只为一场梦,一切只是一场梦——醒是梦?梦是梦?天涯无尽何时终?

问题太多了,不know。电话来了还得接,事情来了还得做,这就是生活!生活?

More......

2007年6月2日星期六

Google的小玩意(Google Gadgets)——消色块游戏

消色块游戏是Google的小玩意(Google Gadgets)之一,我消到剩15个色块。
大家也试试,贴个结果上来:)



More......

新增加blogger登录入口

刚才把 http://www.blogger.com的登录入口迁移到页面的侧边栏上,这样6apples团队的朋友们就可以不必跳转到www.blogger.com再登录了,可直接通过边栏里的登录入口直接进入控制台,希望大家喜欢^o^

实现方法:
通过 HTML/JavaScript 页面元素 添加如下代码:
(声明:这段代码是www.blogger.com登录入口的代码,我只是做了部分调整)

<div style="padding:0px 0px 0px 25px ">

<script type="text/javascript">

<!--

function setFocus() {

if (document.forms[0].Email.value == null

document.forms[0].Email.value == "") {

document.forms[0].Email.focus();

} else {

document.forms[0].Passwd.focus();

}

}

//-->

</script>

<script type="text/javascript">

<!--

function onlogin() {

return;

}

//-->

</script>



<form id="start-login" action="https://www.google.com/accounts/ServiceLoginBoxAuth" name="login" onsubmit="onlogin()" method="post">

请使用您的 Google 帐户登录

<input value="http://www.blogger.com/loginz?d=%2Fstart" name="continue" type="hidden"/>

<input value="blogger" name="service" type="hidden"/>

<input value="8" name="nui" type="hidden"/>

<input value="8" name="naui" type="hidden"/>

<input value="2" name="fpui" type="hidden"/>

<input value="3" name="uilel" type="hidden"/>

<input value="true" name="skipvpage" type="hidden"/>

<input value="false" name="rm" type="hidden"/>

<input value="zh_CN" name="hl" type="hidden"/>

<input value="true" name="alwf" type="hidden"/>

<input value="https://www.blogger.com/login.g" name="roeu" type="hidden"/>

<input value="WbnRqO_ScZo" name="GA3T" type="hidden"/>

<div class="input-holder">

<label for="Email">

用 户 名: <input id="Email" tabindex="1" value="" name="Email" size="10" type="text"/>

</label>

</div>

<div class="input-holder">

<label for="Passwd">

密 码:(<a href="https://www.google.com/accounts/ForgotPasswd?fpOnly=1&amp;continue=http%3A%2F%2Fwww.blogger.com%2Floginz%3Fd%3D%252Fstart&amp;service=blogger&amp;hl=zh_CN&fpui=2" target="_top" title="忘记了密码?">?</a>)

</label>

<input id="Passwd" tabindex="2" autocomplete="off" name="Passwd" size="10" type="password"/>

</div>

<div id="PersistentCookie-holder">

<input id="PersistentCookie" tabindex="3" value="yes" name="PersistentCookie" type="checkbox"/>

<label for="PersistentCookie"> 记住我</label>

(<a href="http://help.blogger.com/bin/answer.py?answer=737" target="_top" title="什么是“记住我”?">?</a>)

<script type="text/javascript">

document.write(" \u003cdiv id\u003d\"signin-btn\" style\u003d\"float:right; padding:0px 60px 0px 0px\" onclick\u003d\"if (this.className.indexOf(&quot;ubtn-disabled&quot;) \u003d\u003d -1) {var e \u003d document[&#39;login'].submit;(e.length) ? e[0].click() : e.click();}\" class\u003d\"ubtn\"\> \u003cdiv class\u003d\"i\"\> \u003ca href\u003d\"javascript:void(0)\" onclick\u003d\"return false;\" tabindex\u003d\"0\"\>\u003cspan\>登录\u003c/span\>\u003c/a\> \u003c/div\> \u003c/div\>");

</script>

<script type="text/javascript">

document.write(" \u003cinput style\u003d\"position:absolute; display:block; width:0; padding:0; z-index:-1; border:none; top:-5000px; left:-5000px\" name\u003d\"submit\" value\u003d\"登录\" type\u003d\"submit\" id\u003d\"signin-btn-hidden\" tabindex\u003d\"-1\"\> ");

</script>

<noscript>

<input id="signin-btn-ns" tabindex="0" value="登录" class="ubtn ubtn-block" name="submit" type="submit"/>

</noscript>

</div></form>

</div>



More......

2007年6月1日星期五

如何实现PROFIBUS从站之间的DX通讯?


通过DX方式可以实现PROFIBUS从站之间的数据交换,无需再在主站中编写通讯和数据转移程序。系统中至少需要一台PROFIBUS 1类主站,两台PROFIBUS非智能从站才能够实现DX模式的数据交换,下面将通过图解,说明实现DX通讯的过程:
首先,在STEP7中创建一个Project,分别插入一个主站:CPU314C,两个从站:CPU315-2DP























然后分别对每个站进行硬件组态:









首先对进行数据发送的从站进行硬件组态:













组态CPU时,要创建一个PROFIBUS网络,并设定操作模式为DP Slave:


















然后选择Configuration页面,用鼠标点击New键,创建数据交换映射区:



















选择Input和Output区,设定地址和通讯字节长度,数据一致性设置为ALL:








































组态完进行数据发送的从站后,我们再组态主站,同样在插入CPU时,要创建PROFIBUS网络,设定为主站模式,并在窗口右侧的PROFIBUS DP树型图中选择已经组态的CPU31X站,把它拖到PROFIBUS总线上:














这时会弹出链接窗口,选中已经组态的从站,点击Connect按钮:



















设定主站与从站之间的数据对应关系:







































主站的输入与从站的输出对应,主站的输出与从站的输出对应,注意将数据通讯的一致性设置为ALL:

















此时组态接收数据的从站,插入该从站CPU时创建PROFIBUS网络,并在Configuration页面中新建两个数据交换对应区,分别设置为MS模式和DX模式:






















设定DX模式下的通讯交换区时,需要设定发送数据从站的站地址,这里为2:























组态完该从站后,再打开主站的硬件组态窗口,将第二个从站挂到PROFIBUS总线上去,点击Connect按键,建立主从站的链接:















设定主站与从站的地址对应关系,并将数据一致性选为ALL:

到此,系统的硬件组态完成,分别将各个站的组态信息下载到PLC中。
在数据发送从站的OB1中编写SFC15程序块,并插入发送数据区DB1,在数据接收从站中的OB1中编写SFC14程序块,插入接收数据区DB2:




































从以上的界面图中,注意SFC14和SFC15的LADDR参数对应的是MS,DX模式下的Local Addr中的地址值,并且为16进制,所以W#16#64对应100,W#16#64对应30,在线监视SFC14和SFC15的RET_VAL参数值为0。
将编写好的OB1,SFC14,SFC15,DB1,DB2分别下载到两个从站当中,同时为了保证从站调电不导致主站停机,向主站下载OB1,OB82,OB86,OB122等程序块。
将各个站切至运行状态,通过变量表对两个从站进行监视如下:



可以看出从站间的数据实现了交换。




More......

S7-200 自由口通讯


自由口模式允许应用程序控制S7-200 CPU的通讯端口,使用PC/PPI电缆和自由口功能,可以将S7-200连接到带有RS-232兼容接口的多种设备,比如调制解调器。这里我们将介绍如何用S7-200连接GSM调制解调器发送短消息,并通过这个例子来介绍应用S7-200自由口编程的一般原则时及应注意的问题。
在下面的例子中我们将用到:
1. PC/PPI电缆(10位;9 600波特;DIP开关设置:0 1 0 1 1)
2. 西门子 S7-200 CPU22X
3. TC35 Terminal GSM调制解调器
4. 一个9直通针转接头(用来连结PC/PPI电缆与TC35 Terminal调制解调器)
5. 一根九针直通电缆(用来连结计算机与TC35 Terminal调制解调器)
6. STEP 7-Micro/Win V3.2或更高版本软件







一、TC35 调制解调器AT指令简介
要使用TC35发送短消息需要使用TC35的AT指令,我们首先介绍如何用Windows自带的超级终端连接TC35发送短消息。
1. 用九针直通的电缆将TC35连接到计算机的串口上
2. 打开超级终端(开始à程序à附件à通讯à超级终端)












3. 为连接取名Connect to TC35T





















4. 选择TC35连接的串口COM1
























5. 按照下图的参数设置端口。19 200 bps为TC35默认的端口波特率,如果该波特率已被更改,请选择正确的波特率。
























6. 在窗口中键入AT回车测试与TC35的连接,如果连接正确,TC35将返回OK。
























7. TC35可以发送两种格式的短消息,普通文本格式和PDU格式。应用普通文本格式时,短消息内容以ASCII码格式直接输入,操作比较简单,缺点是只能发送英文短消息;应用PDU格式时,短消息内容以Unicode格式输入,可以发送任何文字,缺点是短消息内容需要转换成Unicode码,并且要把短消息按PDU格式打包,操作比较复杂(编程复杂)。通过指令AT+CMGF=0设置TC35以PDU格式发送短消息(默认),AT+CMGF=1设置TC35以普通文本格式发送短消息。















8. 如何以普通文本格式发送短消息可以在S7-200的网站上找到http://www.ad.siemens.com.cn/applic/s7-200/modem.asp ,这里我们将介绍如何发送中文短消息。要发送中文短消息必须把短消息内容转换成Unicode码,并按照PDU格式打包发送给TC35。PDU数据格式涉及手机开发的相关知识,我们不作详细介绍,这里指给出一个标准格式供大家使用。以下就是一个PDU格式的数据包:
0001000D91683108214365F700080459296C14
其中,红色的数字(3108214365F7)代表对方的手机号码,在PDU格式中,手机号码每两位需要对调。比如在上面这个例子里,对方的手机号码为13801234567,F用来补充7后面的空位。蓝色的数字(59296C14)是短消息内容的Unicode码,这里5929代表“天”
6C14代表“气”。Unicode码同样可以用来表示中一般英文字母和数字,方法是在英文或数字的ASCII码前加00。紫色的数字(04)代表短消息的长度,它等于其后所有字符个数除以2。黑色的数字每次发送短消息时都是相同的,使用时可以照抄,但前提是所使用的SIM卡在使用前要用手机设置好短消息服务中心号码(+8613800100500)。汉字的Unicode码可以通过编码转换软件得到,我们使用的是Megaton Technology公司的一个编码转换软件


















9. 在使用PDU格式发送短消息时,还必须计算整个PDU数据包的长度,PDU数据包的长度等于(PDU数据包字符数-2)/2,在上面的例子里:(38-2)/2=18。发送短消息时,我们先向TC35发送AT+CMGS=回车(Length是计算好的PDU数据包的长度),TC35收到指令后返回一个“〉”符号,然后我们发送整个PDU数据包并以组合键Ctrl+Z结束。















如果短消息被成功的发送,TC35会返回+CMGS: x,其中“x”代表该模块以及发送的短消息个数,同时返回OK。

二、 设置TC35
在将TC35连接到S7-200之前我们先要对TC35作一些设置,使其适合与PLC通讯。
1. 通过指令AT+IPR=9600设置TC35的端口波特率为9 600 bps

















2. 重新建立一个波特率为9 600 bps的连接,用指令ATE0禁止回波功能。回波功能使调制解调器将收到的指令回发给发送方,这项功能会给PLC编程来来不便,当禁止回波功能后,TC35只返回指令执行的结果,比如OK等等



















3. 键入AT&W0回车将当前设置存为用户配置文件(掉电保持),再键入ATZ0以用户配置文件重新启动。此后TC35重新上电时将按照前面所作的设置启动。

三、 PLC编程
现在,我们已经知道如何用AT指令发送短消息,剩下的工作是用PLC程序来发送这些AT指令。S7-200的通讯端口为RS-485接口,RS-485接口为半双工接口,因此,编写PLC程序的关键是避免在通讯端口上同时发送和接收。我们下面将介绍一种标准的编程模式,按照这种模式编写自由口通讯程序可以有效的避免因同时发送和接收造成的通讯冲突,从而保证程序的正常运行。
1. 初始化
Network 1
LD SM0.1
MOVB 9, SMB30
MOVB 2#11000100, SMB87
MOVB '>', SMB88
MOVW +5, SMW92
MOVB 255, SMB94
ATCH INT_0, 23
ATCH INT_1, 9
ENI
将上面这段程序添加到主程序中,对PLC的端口0进行初始化。这段程序以SM0.1为触发条件,每当PLC进入RUN状态时执行一次。
MOVB 9, SMB30
该指令将端口0设置为 9600,8,N,1 自由口方式
MOVB 2#11000100, SMB87
SM87.7=1 允许端口0接收字符
SM87.6=1 当检测到与SMB88中相同的字符时开始接收,并将该字符当作信息的首字符
SM87.5=0 不检测信息的结束字符
SM87.4=0 不检测端口空闲状态
SM87.3=0 定时器为内部字符定时器,意思是PLC开始接收信息后(检测到起始字符),每接收到一个字符就启动定时器,当定时器到达在SMW92中设置的时间后,即认为定时器超时
SM87.2=1 允许在定时器超时后停止接收,并产生接收完成中断
SM87.1=0 忽略Break条件
MOVB '>', SMB88
设置接收起始字符为ASCII码的”>”,当TC35收到AT+CMGS=后将返回”>”,当PLC收到”>”后发送PDU数据包
MOVW +5, SMW92
设置定时器超时时间为5 ms
MOVB 255, SMB94
设置RCV指令接收的最大字符数位255
ATCH INT_0, 23
中断时间23为端口0接收完成中断,将该中断连接到中断0
ATCH INT_1, 9
中断时间9为端口0发送完成中断,将该中断连接到中断1
ENI
中断允许

2. 接收TC35的信息
Network 2
LD SM0.0
RCV VB100, 0
在初始化程序中,端口0以被允许接收来自TC35的信息,在主程序中添加上面的程序将端口0置于接收状态。这时端口0将检测收到的字符,当收到”>”时即开始接收,并把收到的信息保存到VB101开始的存储器中(VB100中将保存每次收到的字符的个数,当接收结束时,该位置被清零)。
3. 发AT指令
PLC要向TC35发送两部分内容来发送一条短消息,首先是AT指令(AT+CMGS=18),当收到”>”后,发送PDU数据包。这里,我们用M0.0的上升沿来触发PLC发送AT指令。在主程序中添加下面指令
Network 3
LD M0.0
EU
R SM87.7, 1
RCV VB100, 0
XMT VB0, 0


R SM87.7, 1
SM87.7置0,禁止在端口0接收信息
RCV VB100, 0
执行RCV指令,停止端口0的接收。
XMT VB0, 0
发送AT指令到TC35
这里需要特别注意的是,在初始化程序中,端口0已被置为接收状态,此时如果直接发送AT指令,将会导致端口0发生通讯冲突,而导致其不能正常工作。因此,我们在发送指令前必须先禁止接收(将SM87.7复0)然后执行RCV指令,RCV指令执行时将会检测SM87.7的状态,当发现SM87.7=0时,即停止端口0的接收。这里我们建议,在使用XMT指令前,首先执行R SM87.7, 1 、 RCV VB100, 0两条指令(VB100可以换成其他地址)。
XMT指令指向VB0,我们将AT指令写在VB0开始的数据块中










4. 发送PDU数据包
当AT指令发送完成时,PLC会产生一个中断,在初始化程序中,我们已经将这个中断连接到INT_1(ATCH INT_1, 9),在这个中断中,我们重新把端口0置于接收状态,用来接收TC35返回的“>“,同时我们将M0.0复位以便检测下一次发送请求并清空RCV指令的接收缓冲区。将下面指令添加到INT_1中:
Network 1
LD M0.0
S SM87.7, 1
RCV VB100, 0
R M0.0, 1
Network 2
LD SM0.0
FILL +0, VW100, 10
TC35接收到AT+CMGS=18后,返回”>”,PLC接收到”>”后开始将接收到的字符保存到VB101开始的存储区,并且每接收一个字符即启动定时器,超过5 ms仍接收不到下一个字符时,就认为本次接收已经完成,产生接收完成中断。在初始化程序中我们已经将该中断连接到INT_0(ATCH INT_0, 23)。将下面指令添加到INT_0中:
Network 1
LDB= VB101, '>'
S M0.1, 1
在中断程序中不易执行过多程序,因此我们在这里判断VB101是否为”>”,如果是则表示TC35等待接收PDU数据,我们通过M0.1在主程序中触发发送PDU数据。将下面这段程序添加到主程序中:
Network 4
LD M0.1
EU
R SM87.7, 1
RCV VB100, 0
XMT VB20, 0
与发送AT指令一样,我们首先要停止端口0的接收,然后发送PDU数据包,PDU数据包保存在VB21开始的数据块中,VB20中保存XMT指令要发送的字节数目。












5. 判断发送状态
在发送完成中断中,我们要重新置端口0为接收状态,同时复位M0.1,并将RCV指令判断的起始字符由原来的”>”改为”+”,因为TC35接收到PDU数举包后会返回”+CMGS: x”表示发送成功,或者” +CMS ERROR: 500”表示发送失败,将下面的指令添加到INT_1中
Network 3
LD M0.1
S SM87.7, 1
MOVB '+', SMB88
RCV VB100, 0
R M0.1, 1

在接收完成中断中(INT_0)我们可以通过判断VB104的状态来判断发送是否成功,如果发送成功,VB104=”G”,如果不成功VB104=”S”。将下面的指令添加到INT_0中




Network 2
LDB= VB104, 'G'
MOVB '>', SMB88
Network 3
LDB= VB104, 'S'
MOVB '>', SMB88
S M0.0, 1
如果成功则将RCV指令的起始字符恢复为”>”,如果不成功则将RCV指令的起始字符恢复为”>”同时置位M0.0重新发送短消息。
将整个程序下载到PLC中,每次置位M0.0即可以向13801234567发送一条短消息,短消息内容为“天气”。只要更改数据块中的内容,即可向不同的手机号码发送不同内容的短消息。整个程序如下:
MAIN
Network 1
LD SM0.1
MOVB 9, SMB30
MOVB 2#11000100, SMB87
MOVB '>', SMB88
MOVW +5, SMW92
MOVB 255, SMB94
ATCH INT_0, 23
ATCH INT_1, 9
ENI
Network 2
LD SM0.0
RCV VB100, 0
Network 3
LD M0.0
EU
R SM87.7, 1
RCV VB100, 0
XMT VB0, 0
Network 4
LD M0.1
EU
R SM87.7, 1
RCV VB100, 0
XMT VB20, 0



INT_0
Network 1
LDB= VB101, '>'
S M0.1, 1
Network 2
LDB= VB104, 'G'
MOVB '>', SMB88
Network 3
LDB= VB104, 'S'
MOVB '>', SMB88
S M0.0, 1


INT_1
Network 1
LD M0.0
S SM87.7, 1
RCV VB100, 0
R M0.0, 1
Network 2
LD SM0.0
FILL +0, VW100, 10
Network 3
LD M0.1
S SM87.7, 1
MOVB '+', SMB88
RCV VB100, 0
R M0.1, 1


四、 总结
这里我们总结以下自由口编程的一般原则:
1. SM0.1触发端口初始化,连接发送完成和接收完成中断(中断事件9和23)
2. SM0.0触发RCV指令
3. XMT指令用上升沿触发,并在指令运行前先停止端口0的接收(复位SM87.7,执行RCV指令)
4. 在发送完成中断中,重新置端口0为接收状态(置位SM87.7,执行RCV指令),清空RCV指令的接收缓冲区
5. 尽量减少在中断程序中编程,如果时间允许仅在中断程序中置标志位,然后在主程序中扫描该位执行具体的程序
6. 根据将要接收信息的不同,合理设置SMB87~SMB94


More......

blogspot似乎再次被封


从昨晚开始,几点不详,blogspot似乎再次被封,xxx.blogspot.com无法直接访问,还好控制台正常。我很费解:google推出的功能如此强大的blog为什么在中国屡遭GFW封杀,要封就一直封,为什么又封封解解?究其用意实在是不Know!

只好使用http://www.pkblogs.com提供的服务,所以本blog的地址由原来的6applesdream.blogspot.com 改为 http://www.pkblogs.com/6applesdream 望新老朋友周知……

补充:今天下午blogspot.com 恢复正常,通过6applesdream.blogspot.com 可以正常访问。

封封解解,不知在搞什么!!!见鬼!!!

More......

2007年5月29日星期二

有机磷酸酯类药物中毒的机制、症状和解救原则


说有机磷酸酯类药物,可能会有很多人不太清楚究竟是些什么东东,不过敌敌畏(DDVP)、敌百虫(dipterex)、乐果(rogor)相信很多人都知道,神经毒气沙林(sarin)、梭曼(soman)可能也有不少人听说过,它们都是有机磷酸酯类药物。

中毒症状:
1、M样作用症状:瞳孔缩小,视线模糊,流涎,出汗,呼吸困难,心动过缓,血压下降等。
2、N样作用症状:肌肉震颤,抽搐,严重者出现肌无力甚至呼吸肌麻痹等。
3、中枢神经系统症状:不安,谵妄,昏迷,甚至呼吸停止。

中毒机制:
有机磷酸酯类药物为难逆性胆碱酯酶抑制剂,其亲电子性的磷与胆碱酯酶的酯解部位中丝氨酸的羟基形成共价键,生成的磷酰化胆碱酯酶不易水解,从而使胆碱酯酶难以复活。当中毒时间过长,则磷酰化胆碱酯酶的磷酰基团上的烷氧基可能断裂,或由于中毒酶的蛋白质部分发生了立体结构改变,使中毒酶不能活化。此过程称为酶的“老化”。所以急性中毒时应及时使用胆碱酯酶复活剂,使胆碱酯酶在老化前就被活化恢复功能。

解救原则:
如系皮肤吸收,则立即用肥皂水清洗皮肤以清除毒物(但敌百虫不宜用肥皂,因为它易变成敌敌畏,毒性增加),然后及时去医院对症治疗。
如系其他途径中毒,应及早给予阿托品以解除M样症状,但如出现N2受体激动后的中毒症状,则必须与胆碱酯酶复活剂合用,使胆碱酯酶恢复活性,从而降低乙酰胆碱的含量,彻底消除病因与症状。

More......