基于欧姆龙Host Link通信协议的串口动态链接库DLL 点击:2358 | 回复:15



wjun7610

    
  • 精华:0帖
  • 求助:0帖
  • 帖子:13帖 | 199回
  • 年度积分:0
  • 历史总积分:416
  • 注册:2004年2月01日
发表于:2007-09-21 23:27:00
楼主

DEMO中默认的PLC站号(单元号或称节点号)=0;


最新欧姆龙PLC全系列Host Link通信协议串口动态链接库DLL


一、最新欧姆龙PLC全系列Host Link通信协议串口动态链接库DLL(以下简称DLL),是为满足工业通信需要,针对工业领域要求上位机对PLC实时采集与控制的组态编程而设计。本DLL是采用Delphi语言开发的标准串口通讯库,具有以下特点:
1)、实时性、可靠性好,可根据通信数据量自行调整通信时间;
2)、适用于多PLC联网和上位机通信,满足多方面的需要;
3)、函数接口功能全,操作简单;
4)、附加实用转换与读取函数,易于快速开发(VC等非RAD开发环境的开发);
5)、支持USB、PC扩展卡等扩展串口号;
6)、支持多种操作系统win9x/win2000/winXP;
7)、可在多种编程环境下使用,例如VB、VC、Delphi等开发环境。

二、DLL函数说明

1、打开串口
Function ComOpen(nport,BaudRate,DataBits,Parity,StopBits:longint;User:Pchar):longint;stdcall;
参数:nport: 打开串口号,取值为1~8,代表COM1~COM8;
      BaudRate:波特率,取值为1200、2400、4800、9600、19200、38400 (推荐使用9600或19200);
      DataBits:数据位,取值为5、6、7、8(推荐使用7或8);
      Parity:  校验位,取值为1(E)、2(O)、3(M)、4(S)、5(N),注括号里是校验位的英文缩写;
      StopBits:停止位,取值为1(1)、2(2)、3(1.5),注括号里是实际的停止位位数       
      User:DLL授权用户名;
返回值:长整型,操作成功返回1,否则返回0;打开串口不成功即返回0时的原因:1)、串口不存在或被占用; 2)、DLL试用过期; 3)、DLL授权注册不正确。

使用举例:
ComOpen(1,9600,7,1,1,'wjun') , 打开COM1口,并设定波特率=9600、数据位=7、校验位=E(偶校验)、停止位=1,授权用户='wjun'。

2、关闭串口
Function ComClose(nport:longint):longint;stdcall;
参数:nport: 串口号,取值为1~8,代表COM1~COM8;
返回值:长整型,操作成功返回1,否则返回0;

使用举例:
ComClose(1) ,关闭打开的COM1口。

3、读取PLC的操作状态----{这很重要因为Host Link只有在监视或编程状态才可以进行写操作与强制操作,工控应用中应使用监视状态}
                              . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Function ComMS(nport,node:Longint):Longint;stdcall;
参数:
nport: 串口号,取值为1~8,代表COM1~COM8;
node: PLC站号或节点号(单元号),取值为0~31;
返回值:长整型,返回值:0:编程、1:运行、2:监视、3:读取错误;

使用举例:
ComMS(1,0),由串口1读取0号PLC的操作状态;

4、改变PLC的操作状态
Function ComSC(nport,node,State:longint):Longint;stdcall;
参数:
nport: 串口号,取值为1~8,代表COM1~COM8;
node: PLC站号或节点号(单元号),取值为0~31;
State:PLC状态参数,取值为0:编程、1:运行、2:监视;
返回值:长整型,操作成功返回1,否则返回0;

5、读取PLC的型号代码
Function ComMM(nport,node:Longint):Pchar;stdcall;
参数:
nport: 串口号,取值为1~8,代表COM1~COM8;
node: PLC站号或节点号(单元号),取值为0~31;
返回值:Pchar(字符串),返回值:"Error":表示读取错误

其他见下表:

型号代码             PLC型号

"01"                 C250
"02"                 C500
"03"                 C120
"0E"                 C2000
"10"                 C1000H
"11"                 C2000H/CQM1/CPM2A/CPM2C/CPM1/CPM1A/SRM1(-V2)
"12"                 C20H/C28H/C40H/C200H/C200HS
"20"                 CV500
"21"          &


楼主最近还看过



jiery

  • 精华:0帖
  • 求助:0帖
  • 帖子:2帖 | 123回
  • 年度积分:0
  • 历史总积分:433
  • 注册:2006年3月29日
发表于:2007-09-22 13:35:00
1楼
请发一份给我好吗?
zjs0226@yahoo.com.cn

鞠躬尽瘁

  • 精华:0帖
  • 求助:0帖
  • 帖子:6帖 | 19回
  • 年度积分:0
  • 历史总积分:106
  • 注册:2004年8月13日
发表于:2007-11-05 22:02:00
2楼
谢谢啊,JUGONG@163.COM

newchp

  • 精华:3帖
  • 求助:0帖
  • 帖子:113帖 | 3966回
  • 年度积分:0
  • 历史总积分:9364
  • 注册:2006年7月15日
发表于:2007-11-05 22:17:00
3楼
老大,你太有才了!

tan_fx

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 1回
  • 年度积分:0
  • 历史总积分:1
  • 注册:2005年5月28日
发表于:2008-04-10 22:09:24
4楼
老大,你太有才了!请发一份给我好吗? 我的邮箱是:tan_fx@126.com,谢谢!

xiaoxiaode

  • 精华:0帖
  • 求助:0帖
  • 帖子:6帖 | 78回
  • 年度积分:0
  • 历史总积分:128
  • 注册:2008年3月27日
发表于:2008-04-11 14:00:41
5楼

     给我一份吧,谢谢 sde556@126.com

镭射

  • 精华:0帖
  • 求助:0帖
  • 帖子:14帖 | 28回
  • 年度积分:0
  • 历史总积分:1
  • 注册:2006年3月08日
发表于:2008-04-12 15:11:57
6楼
他是要钱的,我也有自己写的  不过没做为DLL 的 没时间完善  一般自己够用就行了,其实很简单!就这还赚钱,想钱想疯了!

镭射

  • 精华:0帖
  • 求助:0帖
  • 帖子:14帖 | 28回
  • 年度积分:0
  • 历史总积分:1
  • 注册:2006年3月08日
发表于:2008-04-12 15:17:17
7楼

writedatatoplc(int dmno,int dmvalue,UINT datatype)

{ BYTE check=0;
dmno=I_TO_O(dmno);
LPBYTE send = new BYTE[17];
send[0]=0x40;
send[1]=0x30;
send[2]=0x30;//
switch(datatype)
{
case 0:
{ send[3]='W';
send[4]='J';//写DM
}
break;

case 1:
{ send[3]='W';
send[4]='D';//写DM
}
break;
case 2:
{ send[3]='W';
send[4]='H';//写DM
}
break;
case 3:
{ send[3]='W';
send[4]='R';//写DM
}
break;
case 4:
{ send[3]='W';
send[4]='L';//写DM
}
break;
case 5:
{ send[3]='W';
send[4]='C';//写DM
}
break;
default:
{ send[3]=' ';
send[4]=' ';//写DM
}
break;

}

send[5]=GetData((BYTE)((dmno&0xF000)>>12));
send[6]=GetData((BYTE)((dmno&0x0F00)>>8));
send[7]=GetData((BYTE)((dmno&0x0F0)>>4));
send[8]=GetData((BYTE)(dmno&0x0F));//地址GetData((BYTE)((check&0x000f)));
send[9]=GetData((BYTE)((dmvalue&0xF000)>>12));
send[10]=GetData((BYTE)((dmvalue&0xF00)>>8));
send[11]=GetData((BYTE)((dmvalue&0xF0)>>4));
send[12]=GetData((BYTE)((dmvalue&0xF)));//值
for(int i=0;i<13;i++)
{
check=check^send[i];
}
send[13]=GetData((BYTE)((check&0xF0)>>4));
send[14]=GetData((BYTE)((check&0xF)));//校验
send[15]=0x2A;
send[16]=0x0D;

WriteToPort( send, 17 );
//有个删除操作
return 0;
}

镭射

  • 精华:0帖
  • 求助:0帖
  • 帖子:14帖 | 28回
  • 年度积分:0
  • 历史总积分:1
  • 注册:2006年3月08日
发表于:2008-04-12 15:18:02
8楼
Readdatafromplc(int dmno,UINT dmlong,UINT datatype)
{ BYTE check=0;
dmno=I_TO_O(dmno);
dmlong=I_TO_O(dmlong);
LPBYTE send = new BYTE[17];
send[0]=0x40;
send[1]=0x30;
send[2]=0x30;//
switch(datatype)
{
case 0:
{ send[3]='R';
send[4]='J';//写DM
}
break;

case 1:
{ send[3]='R';
send[4]='D';//写DM
}
break;
case 2:
{ send[3]='R';
send[4]='H';//写DM
}
break;
case 3:
{ send[3]='R';
send[4]='R';//写DM
}
break;
case 4:
{ send[3]='R';
send[4]='L';//写DM
}
break;
case 5:
{ send[3]='R';
send[4]='C';//写DM
}
break;
default:
{ send[3]=' ';
send[4]=' ';//写DM
}
break;

}

send[5]=GetData((BYTE)((dmno&0xF000)>>12));
send[6]=GetData((BYTE)((dmno&0x0F00)>>8));
send[7]=GetData((BYTE)((dmno&0x0F0)>>4));
send[8]=GetData((BYTE)(dmno&0x0F));//地址GetData((BYTE)((check&0x000f)));
send[9]=GetData((BYTE)((dmlong&0xF000)>>12));
send[10]=GetData((BYTE)((dmlong&0xF00)>>8));
send[11]=GetData((BYTE)((dmlong&0xF0)>>4));
send[12]=GetData((BYTE)((dmlong&0xF)));//长度
for(int i=0;i<13;i++)
{
check=check^send[i];
}
send[13]=GetData((BYTE)((check&0xF0)>>4));
send[14]=GetData((BYTE)((check&0xF)));//校验
send[15]=0x2A;
send[16]=0x0D;

WriteToPort( send, 17 );
delete10[] send;
return 0;
}

镭射

  • 精华:0帖
  • 求助:0帖
  • 帖子:14帖 | 28回
  • 年度积分:0
  • 历史总积分:1
  • 注册:2006年3月08日
发表于:2008-04-12 15:20:57
9楼
Recevedmfromplc(WPARAM ch)
{ CString temp;
if(ch=='@')
{
m_receve.Insert(0,"~~~~~~~~~~~~~~~~~~~~~");
m_receve.SetAt(0,'@');
m_Idex=1;
temp="数据刚开始";

}
else
{
m_receve.SetAt(m_Idex,ch);
if( m_receve.Find("*\r",0)==-1)
{

temp="数据还没接受完";

}
else
{
temp=m_receve.Mid0(5,2);
switch((myatoi(temp)))
{
case 00:
{
if(m_receve.Mid0(3,2)=="RD")
{ //temp.Format("来自%d号站%s的数据为%d",myatoi(m_receve.Mid0(1,2)),"读取DM",
// (short)myatoi(m_receve.Mid0(7,4)));
temp=m_receve.Mid0(7,4);
}
else
{
if(m_receve.Mid0(3,2)=="RR")

temp.Format("来自%d号站%s的数据为%d",myatoi(m_receve.Mid0(1,2)),"读取RR",
(short)myatoi(m_receve.Mid0(7,4)));
else
{
temp.Format("来自%d号站%s",myatoi(m_receve.Mid0(1,2)),"其他操作应答");
}
}
}
break;
case 01:
{
temp="PLC在运行方式下不能执行";
}
break;
case 02:
{
temp="PLC在监控方式下不能执行";
}
break;
case 04:
{
temp="地址超出区域";
}
break;
case 13:
{
temp="FCS校验出错";
}
break;
case 14:
{
temp="格式出错";
}
break;
case 15:
{
temp="入口码数据错误数据超出规定范围";
}
break;
default:
{
temp="挂饿";
}
break;
}

}
m_Idex++;

}
return temp;

}

wjun7610

  • 精华:0帖
  • 求助:0帖
  • 帖子:14帖 | 199回
  • 年度积分:0
  • 历史总积分:436
  • 注册:2004年2月01日
发表于:2008-04-13 08:43:44
10楼
各位需要DLL的DEMO及DLL的网友请发邮件到wjun7610@yahoo.com.cn,请不要在帖子里攻击他人,我的DLL是自己开发的收取适当的软件费用很正常,欧姆龙的HostLink协议本就是公开的如果自己可以开发自然不需要购买本控件。本DLL是给广大工控朋友提供快速开发工控软件的便利,不需要的人请离开。out……

叶诗

  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 23回
  • 年度积分:0
  • 历史总积分:176
  • 注册:2005年3月15日
发表于:2009-06-03 11:56:51
11楼

我喜欢有生意头脑的技术人。

愿各位相互尊重!

局外人!

[明月夜]

  • 精华:3帖
  • 求助:0帖
  • 帖子:114帖 | 3593回
  • 年度积分:0
  • 历史总积分:7688
  • 注册:2008年3月16日
发表于:2009-06-03 14:56:17
12楼

.DLL 方式在工控上用处不大,因为,工控用的人机界面软件 一般 为OPC或DDE标准接口

 

AutoCtrl

  • 精华:0帖
  • 求助:0帖
  • 帖子:57帖 | 465回
  • 年度积分:48
  • 历史总积分:2394
  • 注册:2007年3月04日
发表于:2009-09-01 22:14:32
13楼

各种通讯资料:超级OPC Server、动态链接库文件(DLL)、通讯源代码等;

www.lflzdh.cn

司马枫叶

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 13回
  • 年度积分:82
  • 历史总积分:287
  • 注册:2016年11月04日
发表于:2018-12-11 14:22:17
14楼

看不明白评论


热门招聘
相关主题

官方公众号

智造工程师