plc数据采集初探
来源:互联网 发布:js是什么文件格式 编辑:程序博客网 时间:2024/05/21 21:48
这段时间,项目需要,要采集plc上的数据,上传服务器,作为大数据采集方。
以前没有使用过plc,感觉plc是象单片机一样的存在。
从x部借来一台plc,西门子的s7-200smart ,据说这个是入门级的plc,但价钱还是很贵的,不是单片机能比的。
从外部接口来看,有一个网口,一组output接口,一组input接口,还有一个db9的rs485接口。还有一组指示灯。
具体如下图:
开发plc的小哥给我讲了一下读,这东西是破解才行,破解方法就是去抓组态软件的数据包,这些人家都做了。
plc的ip和port是可设置的,所以我拿过来,把这些当成一个Socket client读就可以了。
流程:
1.建Socket
2.握手
3.数据读写
4.关闭Socket
详细解说,第一步就是一个普通的socket建立,只是port号和ip要设好,tcp方式。
第2步握手:
static int plcnet_shake_hands()
{
int i,num;
unsigned char recvdata[1024];
unsigned char shake_hands1[] = {0x03,0x00,0x00,0x16,0x11,0xE0,0x00,0x00,0x00,0x09,0x00,0xC1,0x02,0x01,0x01,0xC2,0x02,0x01,0x01,0xC0,0x01,0x0A};
unsigned char shakeret1[] = {0x03,0x00,0x00,0x16,0x11,0xD0,0x00,0x09,0x00,0x01,0x00,0xC0,0x01,0x0A,0xC1,0x02,0x01,0x01,0xC2,0x02,0x01,0x01};
unsigned char shake_hands_2_send[] = {0x03,0x00,0x00,0x19,0x02,0xF0,0x80,0x32,0x01,0x00,0x00,0xCC,0xC1,0x00,0x08,0x00,0x00,0xF0,0x00,0x00,0x01,0x00,0x01,0x03,0xC0};
unsigned char shake_hands_2_return[] = {0x03,0x00,0x00,0x1B,0x02,0xF0,0x80,0x32,0x03,0x00,0x00,0xCC,0xC1,0x00,0x08,0x00,0x00,0x00,0x00,0xF0,0x00,0x00,0x01,0x00,0x01,0x00,0xF0};
if(send(sockfd, shake_hands1, sizeof(shake_hands1),0) == -1)
{
printf("ERROR: Failed to sent string.\n");
}
memset(recvdata,0,1024);
num=recv(sockfd, recvdata, LENGTH, 0);
if(send(sockfd, shake_hands2, sizeof(shake_hands2), 0) == -1)
{
printf("ERROR: Failed to sent string.\n");
}
memset(recvdata,0,1024);
recv(sockfd, recvdata, LENGTH, 0);
return 0;
}
第3步是数据读写,但我们的数据采集都是读,所以只做了个读:
int plcread(unsigned int base,unsigned int kuai,unsigned int qu,unsigned int lenths,unsigned char *data)
{
int i,j;
int num;
unsigned int tmp=0;
unsigned char recvdata[1024];
unsigned char cmd[512]={0x03,0x00,0x00,0x1f,0x02,0xf0,0x80,0x32,0x01,0x00,0x00,0x00,0x1b,0x00,0x0e,0x00,0x00,0x04,0x01,0x12,0x0a,0x10,0x02};//22
//lenths
tmp=lenths;cmd[23]=(tmp&0xff00)>>8;cmd[24]=tmp&0xff;
//kuai
tmp = kuai; cmd[25]=(tmp&0xff00)>>8;cmd[26]=tmp&0xff;
//qu
tmp = qu;cmd[27]=(tmp&0xff00)>>8;cmd[28]=tmp&0xff;
//addrbase
tmp = base*8;cmd[29]=(tmp&0xff00)>>8;cmd[30]=tmp&0xff;
// printf("addr:0x%04x 0x%02x 0x%02x \n",tmp,cmd[29],cmd[30]);
if((num = send(sockfd, cmd, 31, 0)) == -1)
{
printf("ERROR: Failed to sent string.\n");
}
memset(recvdata,0,1024);
num = recv(sockfd, recvdata, LENGTH, 0);
j=0;
for(i=0;i<num;i++)
{
printf("0x%02x ",recvdata[i]);
}
printf("\n");
}
参数就是plc的区,块,读的起始地址,读的长度。数据返回是在包最后字节里面。
第4步是关闭,把socket关闭完事。
只玩了几天,理解不深,后面会有几种型号的plc支持。
- plc数据采集初探
- 数据采集方案初探
- 上位机与PLC通讯及OPC数据采集实践一
- 使用libnodave采集西门子840D数控系统S7-300 PLC数据
- 初探PLC远程通讯技术
- 工业4.0时代,您需要的是高性价工业物联网智能网关(超高性价比),PLC远程监控,PLC远程维护,系统数据采集,一个都不能少。
- 工业4.0时代,您需要的是高性价工业物联网智能网关,PLC远程监控,PLC远程维护,系统数据采集,一个都不能少。
- PLC读取EDA9033F数据
- 采集数据
- 数据采集
- 数据采集
- 通过OPC读写PLC数据
- plc
- Plc
- PLC
- PLC
- PLC
- PLC
- EasyNVR H5无插件直播方案前端架构之:直播页面和视频列表页面切换的问题
- Vim工具常用的命令
- 做到这一点,你也可以成为优秀的程序员
- 佛祖保佑 永无BUG
- 剑指offer(十二)数值的整数次方
- plc数据采集初探
- 温故而知新--linux协议栈
- 设计模式之单例模式
- 多级联动,下拉列表取text及value值的两种方法(传统方法+JQuery方法)
- 仓库初始化
- git push首次提交报错denyCurrentBranch
- python中的静态方法和类方法
- 解决aptitude 安装软件时 package XXX is not configure yet
- oracle 基础知识查询