




已阅读5页,还剩23页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
PC与三菱PLC串口通讯实例,简介,PC与PLC之间的通讯,按硬件接口分类主要分为串口通讯和网口通讯:,RS-232C,RS-422A,RS-485,UDP,串口通讯,TCP,网口通讯,目录,1.三菱PLC数据操作对象元件,1.三菱PLC操作元件分为位元件和字元件 位元件主要有:X、Y、M、S、T、C. 字元件主要有:D. 2.元件说明 输入继电器”X”是可编程控制器从外部的输入开关接受信号的窗口(只能读不能写,输入寄存器必须由外部信号驱动); 输出继电器”Y”是可编程控制器驱动外部负载的窗口; 辅助继电器”M”是可编程控制器内部辅助继电器软元件; 状态”S”是可编程控制器内部状态继电器软元件; 定时器”T”是可编程控制器定时溢出软元件; 计数器”C”是可编程控制器计数溢出软元件; 数据寄存器”D”是可编程控制器保存数据的软元件(FX系列可编程控制器的数据寄存器是16位(最高位是正负位),组合2个寄存器可以处理32位(最高位是正负位)的数值)。,2.三菱PLC元件首地址,读取PLC主要内部元件地址如下: D:address*2+1000H; M:address*2+0100H; X:address+0080H; Y:address+00A0H; T:address+00C0H; C:address*2+01C0H; S:address*3; .注意:address为十进制数. 例1:D0的地址为 0*2+1000H 算一算: 1.D123的地址? 2.M40的地址? 3.Y13的地址?,1000H+123*2=1000H+F6H=10F6H,0100H+40*2=0100H+50H=0150H,00A0H+13=00A0H+DH=00ADH,3.PLC数据类型 和储存格式,2.PLC数据储存格式 整数(int型) 三菱PLC 普通数据为int型(-3276832767) 如: PLC寄存器数据格式:0、1.32766、32767、 32768、 32769、 65535 实际数据: 0、1.32766、32767、-32768、-32767、-1 读取PLC的数据为: 34 30 30 30 38 30 30 30 8000H -32768 浮点数(real型32位) 读取PLC的数据为: 32 33 42 39 46 43 33 44 3DFCB923H 转换成二进制:0011 1101 1111 1100 1011 1001 0010 0011 0:判断正负数(0为正数;1为负数) 011 1101 1:指数 111 1100 1011 1001 0010 0011:数值,3.PLC数据类型储存格式,2,1,4 3 2 1,3.PLC数据类型和储存格式,指数:011 1101 1b=123d 123-127=-4 PLC在储存数值时,第一位都为1,所以不保存在数据里,在分析数据时要加上1. 数值:1111 1100 1011 1001 0010 0011 =1*1/(24)+1*1/(25)+1*1/(25)+1*1/(25)+1*1/(25)+1*1/(25)+0*1/(25)+.1*/(227) =0.1234 3.举一反三 1.把12.34转换成PLC写入的数据? 2.把0.79转换成PLC写入的数据?,41 31 37 30 34 35 34 31,37 30 33 44 34 41 33 46,4.PC与PLC串口通讯操作,一.对位元件和字元件状态读操作 发送格式: 命令格式: STX CMD0 ADD LEN EXT CHK 解释: 起始符 读命令 元件起始位 个数 停止符 校验码 数字代码格式: 0x02 0x30 0x03 0x30是读操作指令; CMDD是读位元件或字元件的4位起始地址,高位先发,低位后发,以ASCII码的格式发送; LEN是一次读取位元件或字元件的字节个数,最多可以读取0xff个字节的元件,以ASCII码的格式发送; CHK是两位和校验,将CMD0,ADD,LEN,EXT三项进行和累计,将和累计的最低位两位转化为ASCII。,4.PC与PLC串口通讯操作,响应格式: 响应信息格式: STX DATA ETX CHK 解释: 起始符 返回的数据 停止符 校验码 数字代码格式: 0x02 0x03 DATA为我们前面读取的数据(读取DATA数据时遵循低位先发,高位后发的原则,所以我们解析数据的时候需要注意高低位的转换); CHK位DATA,EXT两项和累计的最后两位转化为ASCII码。 例2:读取D2寄存器的数据 读取码:0x30 D2 的寄存器地址:2*2+1000H=1004H (0x31、0x30、0x30、0x34) 个数:0x30、0x34 校验码:30+31+30+30+34+30+34+03=15C (0x35、0x43) 发送数据:0x02 0x30 0x31 0x30 0x30 0x34 0x30 0x34 0x03 0x35 0x43 响应:0x02 0x32 0x34 0x42 0x39 0x46 0x43 0x33 0x44 0x03 0x45 0x34 0.1234 练练手:1.读取D123寄存器的数据? 2.读取Y13的值?,02 30 31 30 46 36 30 34 03 37 34,17. 10 02 30 30 30 41 44 30 31 03 37 39 返回:02 30 32 03 36 35 0000 1000,4.PC与PLC串口通讯操作,二.对位元件和字元件状态写操作 发送格式: 命令格式: STX CMD1 ADD LEN DATA EXT CHK 解释: 起始符 写命令 元件起始地址 位数 写入的数据 停止符 校验码 数字代码: 0x02 0x31 . 0x03 0x31是写操作指令; DATA是待写入PLC缓冲区的数据,低位先发,高位后发,以ASCII码的形似发送; 其他的和读指令一样。 响应格式: 返回06,表示写入成功; 返回15,表示写入失败。 例3:把12.23写入D10寄存器里 写命令:0x31 首地址:10*2+1000H=1014H (0x31、0x30、0x31、0x34) 个数:0x30、0x34 写入的数据:0x31、0x32、0x41、0x46、0x34、0x33、0x34、0x31,4.PC与PLC串口通讯操作,校验码:31+31+30+31+34+30+34+31+32+41+46+34+33+34+31+03 =314H (0x31、0x34) 发送数据:0x02 0x31 0x31 0x30 0x31 0x34 0x30 0x34 0x31 0x32 0x41 0x46 0x34 0x33 0x34 0x31 0x03 0x31 0x34 如果响应反馈是06表示写入成功,否则写入失败。 练练手:1.把1.2写入寄存器D6的的数据? 2.把1写入Y1寄存器中?,Y1: 0000 0000 02 31 30 30 41 31 30 31 30 32 03 43 39,02 31 31 30 30 43 30 34 31 32 41 46 34 33 34 31 03 31 34,13,可编辑,5.SCI与三菱PLC串口通讯流程,一.设置变量 写入变量:首地址、写入个数、校验码、发送的数据、接受数据 读取变量:首地址、读取个数、校验码、读取的数据. 二.把操作PLC的指令赋值给变量 新建一个脚本,把要操作PLC的命令赋值给发送的数据。 三.发送赋值的变量给PLC 1.新建一个串口算子 设置发送数据的变量、设置发送数据格式:ASCII编码、字符串格式。 2.配置串口参数 波特率:9600 停止位:1 奇偶校验:偶 数据位:7 四.接受PLC响应的数据 新建一个脚本,解析响应的数据。,15,可编辑,6.程序实现,一.读数据操作 1.读取设置 CustomVar.Fx_Raddr=0 /读取首地址 小于255 CustomVar.Fx_Rnum=2 /读取个数 小于16 2.转换成发送数据格式 var s=“0201003“ /02和03为十六进制ASCII(02H:Ctrl+B;03H:Ctrl+PauseBreak) var temp= new Array(); /创建一个数组 temp.length=4; /设置数组长度 Ra=(CustomVar.Fx_Raddr*2).toString(16).toUpperCase(); /首地址转换成十六进制字符串 if(Ra.length2) /少于两位补0 Ra=“0“+Ra; Rn=(CustomVar.Fx_Rnum*4).toString(16).toUpperCase(); /个数转换成十六进制字符串 if(Rn.length2) /少于两位补0 Rn=“0“+Rn; a=Ra+Rn;,6.程序实现,for(i=0;i4;i+) if(parseInt(a.substr(i,1),16)=9) /09加48;AF加55(0的ASCII码30H,30H转换十进制为48; A的ASCII码41H,41H转换十进制为55) tempi=parseInt(a.substr(i,1),16)+48; else tempi=parseInt(a.substr(i,1),16)+55; a=(48+49+48+3+temp0+temp1+temp2+temp3).toString(16); /数据值累加并转换成十六进制字符 CustomVar.Fx_Rchk=a.substr(a.length-2,2).toUpperCase(); /取后两位作为和校验 CustomVar.Fx_RS=s.substr(0,4)+Ra+Rn+s.substr(4,1)+CustomVar.Fx_Rchk; /发送的字符串,6.程序实现,3.转换响应返回的数据 var temp=new Array(); temp.length=CustomVar.Fx_Rnum*8; for(i=0;iCustomVar.Fx_Rnum*8;i+) if(串口_2.DataArray1+i=57) /判断接收的每位数据是否小于等于57 tempi=(串口_2.DataArrayi+1-0x30).toString(16).toUpperCase(); /把接收的数据转换成十六 进制字符串 else tempi=(串口_2.DataArrayi+1-0x30-0x7).toString(16).toUpperCase(); for(i2=0;i2CustomVar.Fx_Rnum;i2+) a=temp2+i2*8+temp3+i2*8+temp0+i2*8+temp1+i2*8+temp6+i2*8+ temp7+i2*8+temp4+i2*8+temp5+i2*8; /把字符串累加 CustomVar.Fx_Ri2=HextoReal(a); /调用函数,并赋值赋值 ,6.程序实现,/把取出的十六进制转换成实属函数 function HextoReal(h) var i3,i4,i5,i6,b,b1,s,e,m,m1; h=h.substr(4,4)+h.substr(0,4); /低四位先发,高四位后发 b=“; for(i3=0;i38;i3+) /把十六进制转换成实数 tempi3=parseInt(h.substr(i3,1),16); for(i4=0;i48;i4+) /把实数转换成二进制 b1=tempi4.toString(2); for(i5=b1.length;i54;i5+) b1=“0“+b1; /补码 b=b+b1; ,6.程序实现,s=b.substr(0,1); /正负数值 e=parseInt(b.substr(1,8),2)-127; /计算指数 m=“1“+b.substr(9); /获取数值 m1=0; for(i6=0;i624;i6+) /把二进制数值转换成实数 m1=m1+m.substr(i6,1)*Math.pow(2,-i6)*Math.pow(2,e); /把二进制转换成实数 if(s=“1“) /判断正负数 m1=-m1; CustomVar.Read_D1=m1; return(m1) ,6.程序实现,二.写数据操作 1.变量赋值 CustomVar.Fx_Waddr=0 /写入首地址 小于255 CustomVar.Fx_Wnum=2 /写入个数 小于16 CustomVar.Fx_W0=12.34 /写入的数据 0表示第一个数据,1表示第二个数据 CustomVar.Fx_W1=0.1234 2.转换成发送数据格式 var s=“0211003“ /02和03为02H的ASCII(02H:Ctrl+B;03H:Ctrl+PauseBreak) var temp= new Array(); /创建一个数组 temp.length=4+8*CustomVar.Fx_Wnum; / 首地址+个数+8*数据个数 Wa=(CustomVar.Fx_Waddr*2).toString(16).toUpperCase();/首地址转换成十六进制字符 if(Wa.length2) /首地址字符长度小于2时,在字符前面加0 Wa=“0“+Wa; Wn=(CustomVar.Fx_Wnum*4).toString(16).toUpperCase(); /个数转换成十六进制字符,6.程序实现,if(Wn.length2) /个数字符长度小于2时,在字符前面加0 Wn=“0“+Wn; Wv=“; for(i3=0;i3CustomVar.Fx_Wnum;i3+) Wv=Wv+RealtoHex(CustomVar.Fx_Wi3); /把要写入的数据转换成十六进制 a=Wa+Wn+Wv; n=0; for(i=0;ia.length;i+) /把字符转换成ASCII码,把ASCII转换成十进制数值 if(parseInt(a.substr(i,1),16)=9) tempi=parseInt(a.substr(i,1),16)+48; /09加48;AF加55(0的ASCII码30H,30H转换十进制为48; A的ASCII码41H,41H转换十进制为55),6.程序实现,else tempi=parseInt(a.substr(i,1),16)+55; n=n+tempi; /数据值累加 a1=(49+49+48+3+n).toString(16); /计算和校验,并转换成十六进制字符串CustomVar.Fx_Wchk=a1.substr(a1.length-2,2).toUpperCase(); /取后
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- T/DZJN 264-2024管道直饮水用复合钢芯管
- 高三原电池课件
- 高一劳动课本内容
- 文化创意产业全职设计师劳动合同与知识产权保护协议
- 离婚后房产分割及子女抚养权补充协议
- 跨国公司知识产权保护、保密及竞业禁止合同范本
- 离婚案件中宅基地房屋分割及共有权确认合同
- 物业公司股权转让及社区智能化升级协议
- 养殖业发展资金统筹方案
- 深入推进职业教育改革指南
- 2025年湖南省国际工程咨询集团有限公司招聘笔试参考题库附带答案详解
- 《应用语文(第三版)》课件 第三单元 特殊情境口语交际
- 期货分成协议书
- 2025pvsyst v8中文版PVsyst SA地形与地面处理
- 瑞幸咖啡开店合同协议
- 中国布艺文化课件
- 帮人贷款协议书范本
- 果农电商合同协议
- 婚礼跟妆合同协议
- 高磷血症健康教育
- 武汉网约车从业资格证考试题库及答案
评论
0/150
提交评论