三菱PLC 串口通信开发心得经验

三菱PLC 串口通信开发心得

备注:

记得两年前刚开始从事软件开发工作时,第一份任务就是开发一个程序能够实现与三菱PLC 串口通信。所谓通信,其实质主要是对PLC 的D寄存器(dword)读写操作。但是因为日本为了保护其产品,并不开发串口通信协议。在不开发通信协议的情况,如果想实现通信,首先需要做的便是通过数据分析,破解其通信协议。

这里就不讲解如何破解了,主要是介绍下当时博主开发程序的背景。

写这篇博客的主要目的是为了分享过去自己的开发经验,因为自己在开发的过程中曾经接受过很多开源软件的帮助,也算是将开源精神延续下去吧

现在这是转入正题。

涉及字节流数据通信,必然要涉及通信协议。鉴于当时的开发需求,博主仅对D 寄存器的读写协议分析过。其他寄存器理论上是相似,有兴趣的同学可以自行分析数据进行测试。

D 寄存器的通信协议相对比较简单

主要可以分为:

1        问候应答协议

2        状态查询协议

3        状态配置协议

4        数据反馈协议

在PLC 通信过程中主要的三个难点在于  寄存器的加密解密, 数据信息加密和解密, 以及字符的校验

寄存器地址 加密过程:

<span style="font-size:18px;">void PLC_dataparse::Encrypt_toPLCaddress( BYTE *parray , const UINT paddress )
{

	int encode_address = 0x1000 + paddress * 2;           

	BYTE encrypt_key = encode_address & 0xf;
	parray[3] = (encrypt_key<10) ? (encrypt_key + 0x30) : (encrypt_key + 0x41 - 0xa);
	encrypt_key = (encode_address >> 4) & 0xf;
	parray[2] = (encrypt_key<10) ? (encrypt_key + 0x30) : (encrypt_key + 0x41 - 0xa);
	encrypt_key = (encode_address >> 8) & 0xf;
	parray[1] = (encrypt_key<10) ? (encrypt_key + 0x30) : (encrypt_key + 0x41 - 0xa);
	encrypt_key = (encode_address >> 12) & 0xf;
	parray[0] = (encrypt_key<10) ? (encrypt_key + 0x30) : (encrypt_key + 0x41 - 0xa);

}
</span>

数据信息的加密过程:

<span style="font-size:18px;">void PLC_dataparse::Encrypt_toPLCcontent( BYTE * parray , const UINT pcontent )
{

	BYTE encrypt_key = pcontent & 0xf;

	parray[1] = (encrypt_key<10) ? (encrypt_key + 0x30) : (encrypt_key + 0x41 - 0xa);
	encrypt_key = (pcontent >> 4) & 0xf;
	parray[0] = (encrypt_key<10) ? (encrypt_key + 0x30) : (encrypt_key + 0x41 - 0xa);
	encrypt_key = (pcontent >> 8) & 0xf;
	parray[3] = (encrypt_key<10) ? (encrypt_key + 0x30) : (encrypt_key + 0x41 - 0xa);
	encrypt_key = (pcontent >> 12) & 0xf;
	parray[2] = (encrypt_key<10) ? (encrypt_key + 0x30) : (encrypt_key + 0x41 - 0xa);

}
</span>

添加校验码:

<span style="font-size:18px;">void PLC_dataparse::Add_checkcode( BYTE * pdest , BYTE * psrc , const UINT plenth )
{
	int sumtemp = 0;
	for ( unsigned int i = 0; i< plenth; i++)
	{
		sumtemp += (*(psrc + i));
	}

	BYTE encrypt_key = sumtemp & 0xf;			// get low 4 bit
	pdest[1] = (encrypt_key<10) ? (encrypt_key + 0x30) : (encrypt_key + 0x41 - 0xa);
	encrypt_key = (sumtemp >> 4) & 0xf;				// get high 4 bit
	pdest[0] = (encrypt_key<10) ? (encrypt_key + 0x30) : (encrypt_key + 0x41 - 0xa);

}
</span>

提取数据信息:

<span style="font-size:18px;">double PLC_dataparse::Get_content( BYTE *parray , UINT plenth )
{
	BYTE dl_data[4];
	BYTE pre_data[4];
	double pow_numb;

	for (int j = 0; j<4; j++)                     //剔除杂码
	{
		pre_data[j] = parray[j + 1];
	}

	//////////////////////////////////////////////////////////////////////////
	dl_data[1] = (pre_data[0]<0x40) ? (pre_data[0] - 0x30) : (pre_data[0] - 0x41 + 0x0a);
	dl_data[0] = (pre_data[1]<0x40) ? (pre_data[1] - 0x30) : (pre_data[1] - 0x41 + 0x0a);
	dl_data[3] = (pre_data[2]<0x40) ? (pre_data[2] - 0x30) : (pre_data[2] - 0x41 + 0x0a);
	dl_data[2] = (pre_data[3]<0x40) ? (pre_data[3] - 0x30) : (pre_data[3] - 0x41 + 0x0a);

	for (int i = 0; i<4; i++)
	{
		dl_data[i] = dl_data[i] & 0xf;
	}

	pow_numb = dl_data[3] * pow(16.0, 3.0) + dl_data[2] * pow(16.0, 2.0) + dl_data[1] * 16 + dl_data[0];
	return pow_numb;

}
</span>

校验接受数据校验码:

int PLC_dataparse::Check_checkcode( BYTE *parray , UINT plenth )
{
	int  error_code  = PLC_SUCCESS;
	const int  legal_lenth = 8;           //the define legal lenth  

	if (plenth != legal_lenth)
	{
		error_code = PLC_CRCERROR;
		return error_code;
	}
	//////////////////////////////////////////////////////////////////////////
	//check  code
	else
	{
		BYTE *pbyte = new BYTE[2];
		// split out  head mark , tail check out
		Add_checkcode(&pbyte[0], &parray[1], plenth - 3);    //calculate the check code 

		for (int j = 0; j<2; j++)
		{
			if (pbyte[j] != parray[plenth - 2 + j])
			{
				error_code = PLC_CRCERROR;
				break;
			}
		}
		// release the pointer and it's stack
		delete pbyte;
		pbyte = NULL;
		return error_code;
	}

}

上述代码是使用PLC 窗口通信的最大的难点。 一旦掌握几大难点,基本PLC 的串口通信就

另附上一份当时自己开发的 三菱PLC D寄存器调试程序。

备注: 该调试工具 仅支持xp 系统

欢迎关注我的github: https://github.com/lionm117

一起学习,共同成长

测试程序下载链接:http://download.csdn.net/detail/hesiyuan4/8304407

动态链接库下载链接: http://download.csdn.net/detail/hesiyuan4/8394939

源码库下载链接:  http://download.csdn.net/detail/hesiyuan4/8394961

时间: 2024-10-01 07:50:33

三菱PLC 串口通信开发心得经验的相关文章

PC软件与PLC串口通信 奇偶检验问题

PC软件与PLC进行串口通信 波特率:19200 校验位:偶检验 数据位:8 停止位:1 现象 一,PC软件向PLC可以发送1,2,4,5,7,8,但是3,6,9发送出去后,PLC无法收到 二,使用虚拟串口,PC软件与串口调试助手可以正常通信 原因 PC软件中,校验位按照Mark(奇偶校验位始终1)位填充. 即,在上述的环境中,PC软件用的是奇偶校验位1发送,PLC使用偶数检验接收,所以根据奇偶检验的原理,可以解释3,6,9无法接收的现象了. 奇偶检验原理 奇校验:就是让原有数据序列中(包括你要

Z-Stack串口通信使用心得

最近在做一个智能家居的项目,用到了TI的CC2530芯片以及对应的zstack协议栈,其中串口通信部分使用的最多,下面就分享一下Z-Stack对串口封装的使用心得. Z-Stack中对串口操作的封装主要在hal_uart.h,hal_uart.c中, 支持DMA和ISR两种处理方式, 真正的实现则都封装在_hal_uart_dma.c 和_hal_uart_isr.c中,  但系统只推荐使用DMA方式, 可以通过修改宏定义来改为ISR的方式,宏定义在hal_board_cfg.h中. Z-Sta

关于串口通信开发的几点注意事项

1.注意串口设备本身的性能: 发送的消息间隔,发送的时候使用线程休眠即可 2.单工还是双工: 这个问题和使用的IO流相关.若为单工,则虽可以获取到串口对应的输入流和输出流,但不能够同时使用,也就是需要使用同步操作控制流的使用. 这样可保证串口通信工作稳定,不至于出现跑着跑着没有响应消息了. public synchronized void serialEvent(SerialPortEvent event) { System.out.println("事件通知" + event.get

三菱FX2N PLC串口通信流程

串口初始化 D8120说明:※ 根据MD320的通讯协议,无帧头和帧尾,则(bit9,bit8)=(0,0).※ bit13-15是计算机链接通讯时的设定项目,使用RS指令时必须设定为0.※ RS485未考虑设置控制线的方法,使用FX2N-485-BD.FX0N-485ADP时,(bit11,bit10 )=(1,1).※ 若PLC和变频器之间的通讯参数如下:8位数据位,无校验,2位停止位,波特率9600,无帧头无帧尾,无协议模式,则D8120=H0C89(H表示16进制)(0000 1100

从今天起,记录CEF使用开发心得经验

已经使用CEF来呈现桌面程序界面大半年了,从来没有写过相关博文.发现网上的中文资料甚至英文已经无法满足我的开发需求,不少问题只得自己探索.在此先谢过网络上各位CEF使用开发博文的贡献者,没有你们我也难易快速入手.实在惭愧,由于精力有限,自己捣鼓出来的东西一直没有贡献出来.好吧,从今天开始,面朝大海,春暖花开. 原先公司的C++程序界面用GDI+来做,甚是麻烦.后来客户想要类似豌豆荚那样的风格,小清新.研究了下豌豆荚,发现它的界面八成是JavaScript,用CEF来嵌入Web页面.此前也听一朋友

SPCOMM控件在Delphi串口通信中的应用

SPCOMM控件在Delphi串口通信中的应用 2010-07-08 22:20:31|  分类: 个人日记 |举报 |字号 订阅 2009-03-01 05:35 摘要:利用Delphi开发工业控制系统软件成为越来越多的开发人员的选择,而串口通信是这个过程中必须解决的问题之一.本文在对几种常用串口通信方法分析比较的基础上,着重讨论了Delphi开发环境下利用Spcomm控件实现PC机与单片机之间串口通信的方法,研究了Spcomm串口通信的关键技术问题,并通过一个实例给出了Spcomm控件在De

工业串口触摸屏开发制作mp3播放器,单片机或PLC通过串口控制播放MP3音频方法

在工业控制系统中将音乐或语音MP3的美和工控结合在一起,给人以赏心悦目的感受.随着工业控制的发展,对工业控制的控制要求也越来越高,使得越来越多的控制部分不是指简单的现场控制,还需要增加音乐播放或语音提示,使得控制系统更加人性化. 这里介绍广州易显的工业串口触摸屏或者ARM工控机连接单片机或者PLC,使用工业串口触摸屏开发制作mp3的方法.跟电脑的播放器一样,具有播放,暂停,停止,控制播放进度,上一首,下一首等功能.可以在人机界面上控制播放MP3音乐或者语音提示.也可以使用单片机或PLC控制播放的

stm32与三菱PLC通信

一.三菱PLC通讯概要   三菱PLC FX系列通信结构如下图所示: 三菱PLC FX系列的通信规格如下图所示: 三菱PLC FX系列一般有以下几种通信模块,以FX2N为例: FX2N-232-BD FX2N-232IF FX2N-232ADP FX2N-485-BD FX2N-422-BD .......... 无协议通讯情况下,以BD结尾的模块一般是使用RS通信指令,以IF结尾的模块一般使用对应的模块指令. 个人觉得BD模块操作起来更简单方便. 具体通信看对应PLC的通讯用户手册,RS-23

嵌入式Linux裸机开发(七)——UART串口通信

嵌入式Linux裸机开发(七)--UART串口通信 一.UART串口通信简介 通用异步收发器简称UART,即UNIVERSAL ASYNCHRONOUS RECEIVER AND TRANSMITTER, 它用来传输串行数据.发送数据时, CPU 将并行数据写入UART,UAR按照一定的格式在一根电线上串 行发出:接收数据时, UART检测另一根电线的信号,将串行收集在缓冲区中, CPU 即可读取 UART 获得这些数据. 在 S5PV210中, UART提供了 4 对独立的异步串口I/O端口,