6SL32110KB125UA1,6SL32110KB125UA1
{西门子与客户携手,让关键所在,逐一实现}
德国制造: 现货 联 系 人: 黄勇《黄工》 24小时联系手机: 13701633515
全新原装: 参数
质量保证: 保修 直线销售 电 话: 021-31660605 在 线 商 务 QQ: 77956468
价格优势: 特价
我公司大量现货供应,价格优势,品质保证,德国原装进口
凡在公司采购西门子产品,均可质保一年,假一罚十
花30秒询价,你会知道什么叫优势;花60秒咨询,你会知道什么叫服务;
合作一次,你会知道什么叫质量!以质量求生存,以信誉求发展。
我公司将提供一流的质量,服务作为自已最重要的责任。
承诺一:1、绝对保证全新原装进口
承诺二:2、绝对保证安全准时发货
承诺三:3、绝对保证售后服务质量
流程一:1、客户确认所需采购产品型号
流程二:2、我方会根据询价单型号查询价格以及交货期,拟一份详细正规报价单
流程三:3,客户收到报价单并确认型号无误后订购产品
流程四:4、报价单负责人根据客户提供型号以及数量拟份销售合同
流程五:5、客户收到合同查阅同意后盖章回传并按照合同销售额汇款到公司开户行
流程六:6、我公司财务查到款后,业务员安排发货并通知客户跟踪运单

西门子S7200PLC如何每进入定时中断子程序寄存器或计数器C0自动加
1 。 在MAIN 主程序中调用定时中断子程序的下面,并联写入上升
沿,使寄存器或计数器C0 加1 。例如:
2 。 M10.0
----------| |-----------------------------------------( 1 )----
M10.0
----------| |----------------| P |-------------------( 2 )-----
(1) 表示调用定时中断子程序。
( 2) 表示寄存器或计数器C0加1
S7-400自动化系统采用模块化设计。它所具有的模板的扩展和配置功
能使其能够按照每个不同的需求灵活组合。
一个系统包括:
? 电源模板;
将SIMATIC S7-400连接到120/230 V AC或24 V DC电源上。
? 中央处理单元(CPU)
有多种CPU可供用户选择,有些带有内置的PROFIBUS-DP接口,
用于各种性能范围。一个中央控制器可包括多个CPU,以加强性能。
? 各种信号模板(SM)用于数字量输入和输出(DI/DO)以及模拟量的输入和输出(AI/A0)
? 通讯模板(CP)用于总线连接和点到点的连接。
? 功能模板(FM):专门用于计数、定位、凸轮控制等任务。
简单的设计系统使S7-400用途广泛、灵活、适用性强:
? 模板安装非常简便
? 背板总线集成在机架内
? 方便、机械码式的模板更换
? 经过现场考验的连接系统
? TOP连接用螺钉或弹簧端子的1到3线系统的预装配接线
? 规定的安装深度
所有端子和接线器都放置在模板凹槽内并有盖板保护
? 没有槽位规则
如果用户需要比中央控制器更多的功能,S7-400还可以扩展:
? 最多21个扩展单元(EU)21个扩展单元(EU)都可以连接到中央控制器(CC)。
? 通过接口模板<IM)连接:中央控制器CC和扩展单元EU通过发送IM和接收IM连接。
中央控制器(CC)可插入最多6个发送IM,每个EU可容纳1个接收IM。每个发送IM有2个接口,
每个接口都能连接一条扩展线路。
? 集中式扩展:这种扩展方式适用于小型配置或控制柜直接在机器上的场合。每个发送IM
接口可支持4个EU,如有必要,还可同时提供5V电源。中央控制器和最后一个EU的最大距离是.5
m(带5 V电源);3 m(不带5 V电源)。 ? 用EU进行分布式扩展: 这种方式适用于分布范围广,
并在一个地方有几个
EU的场合。发送IM的每个接口最多可支持4个EU。可以使用S7-400 EU,或SIMATIC S5 EU。
中央控制器和最后一个EU的最大距离为100 m(S7 EU) ;600 m(S5 EU)。采用扩展方案时应遵守以下原则:
任一中央控制器的扩展单元(EU)数量最多不应超过21个。- 连接到任一中央控制器的发送IM不能超过6个,并且最多只有
2个IM可提供5 V电源- 中央控制器器和7 EU的最大距离为100 m。 - 通过C总线的数据交换,仅限
中央控器和6个EU(EU1~EU6)之间。 - 电源模板总是安装在中央控制器和EU的最左边。 ? ET 200
进行远程扩展;这种方式适用于分布范围很广的系统。通过CPU中的–DP接口最多可连接125个总线结点。中
央控制器和最后一个结点的最大距离为
23 km
怎样学好PLC编程
看到很多网友问学习PLC的方法, 现将我个人学习PLC编程的心得总结如下,大家有更好的方法请补充:
1.有一定的电工基础-----掌握传感器、接近开关、编马器、气动元件等常用器件的使用及继电器控制原理。
2.再学数制及数制转换-----掌握二进制、八进制、十六进制、BCD码、ASCI码的概念。
3.选择你所在地区流型的PLC品牌做为学习的机种.---------学会后可以更好的与实际工作对接。
4.买台手提电脑(配制不低于CPU最好是双核或以上 ,1G内存,硬盘80G,带串口)----必备学习及外出干活的工具。
5. 学会电脑的基本操作,如开机关机、文件保存以及WORD、EXCEL办公软件的基本应用(电脑使用者必会);常用软件的安装与卸载(如编程软件的安装和卸载);打字(用于程序起名及加注释)。
6.寻找PLC编程软件及仿真软件、教学软件(当然还要学会使用它们)。-----必备学习用具。
7. 买相关书及视频教材(电工论坛有欧姆龙,西门子,松下PLC视频教程直播)。-----学习资料。
8. 找齐该PLC编程手册、使用手册、使用案例,可从网上收集或参加产品推广会获得。----工作中肯定会用到的资料.
9. 以上准备好后,您可以自学PLC了,一般来说PLC梯形图的基本指令好学,其逻辑关系与继电器控制原理图相通。但功能指令就难很多了。
10.最好是到有实力口碑好的学校培训.-----比起自学可缩短学习时间,学得更系统,还可多交恩师、学友以利于今后发展。
11. 用一切办法多结识周围的同行、PLC厂家、代理商,以便于得到他们的帮助及有用的信息。
12. 坚持学习,多与同行交流,多动手实践.-----编程是理论与技能高度结合的,应多看书多实践才能提高编程技术。
13. 当外出包工程时,还要准备该类型PLC程序解密软件------因为有时你会忘记自己程序中已加的密码,还有时是别人加密的程序,客户要你J将它再优化、增加新功能、修改参数、将原来定时停机的程序删除。这也是很多人找解码软件的原因。
运用VC#编程通过OPC方式实现PC机与西门子PLC通讯
1、 配置OPC服务器
对于服务器的配置与同步通讯的配置一样,这里不需再讲解,若有不清楚的,可以参阅之前发布的<运用VC#编程通过OPC方式实现PC机与西门子PLC通讯>
2、 OPC编程
变量组、项的命名规则与同步通讯的一样,这里不再描叙,下面主要就开发一个异步通讯类 AsynServer来讲解如何编程。
<1>、引用
在VC#开发环境中添加对OpcRcw.Da库以及OpcRcw.Comn库的引用,该库属于.NET库,不属于COM库,西门子虽然编写了类库,以提供对.NET平台的支持,但这些类库仍然难于编程,里面包含了大量的在托管和非托管区传输数据,因此我们需要在它的基础上再开发一个类库,以简化以后的编程,首先在类的开头使用命名空间:
using OpcRcw.Comn;
using OpcRcw.Da;
using System.Runtime.InteropServices;
using System.Collections;
<2>、编程
异步编程的原理就是在OPC服务器那边检测当前活动的变量组,一但检测到某一个变量,譬如变量Q0.0从1变成0,就会执行一个回调函数,以实现针对变量发生变化时需要实现的动作,在这里可以采用委托来实现该功能。
1、 在命名空间的内部、类 AsynServer声明之前添加委托的申明:
// 定义用于返回发生变化的项的值和其对应的客户句柄
public delegate void DataChange(object[] values,int[] itemsID);
2、 该类继承于西门子提供的库接口IOPCDataCallback
public class AsynServer:IOPCDataCallback
在类的开头部分声明变量:
struct groupStru
{
public int groupID;
public object groupObj;
}
internal const int LOCALE_ID = 0x407; //本地语言
private Guid iidRequiredInterface;
private string serverType="";
private int hClientGroup = 0; //客户组号
private int nSvrGroupID; // server group handle for the added group
private Hashtable hashGroup; //用于把组收集到一起
private int hClientItem=0; //Item号
3、编写构造函数,接收委托参数已确定当数据发生变化时需要执行的方法入口点:
//创建服务器
//svrType 服务器类型的枚举
//dataChange 提供用于在数据发生变化时需要执行的函数入口
public AsynServer(ServerType svrType,DataChange dataChange)
{
switch(svrType)
{
case ServerType.OPC_SimaticHMI_PTPR
serverType="OPC.SimaticHMI.PTPro";break;
case ServerType.OPC_SimaticNET:
serverType="OPC.SimaticNET";break;
case ServerType.OPC_SimaticNET_DP:
serverType="OPC.SimaticNET.DP";break;
case ServerType.OPC_SimaticNET_PD:
serverType="OPC.SimaticNET.PD";break;
case ServerType.OPCServer_WinCC:
serverType="OPCServer.WinCC";break;
}
hashGroup=new Hashtable(11);
dtChange=dataChange;
}
4、创建服务器
// 创建一个OPC Server接口
//error 返回错误信息
//若为true,创建成功,否则创建失败
public bool Open(out string error)
{
error="";bool success=true;
Type svrComponenttyp ;
//获取 OPC Server COM 接口
iidRequiredInterface = typeof(IOPCItemMgt).GUID;
svrComponenttyp = System.Type.GetTypeFromProgID(serverType);
try
{
//创建接口
pIOPCServer =(IOPCServer)System.Activator.CreateInstance(svrComponenttyp);
error="";
}
catch (System.Exception err) //捕捉失败信息
{
error="错误信息:"+err.Message;success=false;
}
return success;
}
5、 编写添加Group的函数
///
/// 添加组
///
/// 组名
/// /创建时,组是否被激活
/// //组的刷新频率,以ms为单位
/// 返回错误信息
/// 若为true,添加成功,否则添加失败
public bool AddGroup(string groupName,int bActive,int updateRate,out string error)
{
error="";bool success=true;
int dwLCID = 0x407; //本地语言为英语
int pRevUpdateRate;
float deadband = 0;
// 处理非托管COM内存
GCHandle hDeadband;
IntPtr pTimeBias = IntPtr.Zero;
hDeadband = GCHandle.Alloc(deadband,GCHandleType.Pinned);
try
{
pIOPCServer.AddGroup(groupName, //组名
bActive, //创建时,组是否被激活
updateRate, //组的刷新频率,以ms为单位
hClientGroup, //客户号
pTimeBias, //这里不使用
(IntPtr)hDeadband,
dwLCID, //本地语言
out nSvrGroupID, //移去组时,用到的组ID号
out pRevUpdateRate, //返回组中的变量改变时的最短通知时间间隔
ref iidRequiredInterface,
out pobjGroup1); //指向要求的接口
hClientGroup=hClientGroup+1;
groupStru grp=new groupStru();
grp.groupID=nSvrGroupID;grp.groupObj=pobjGroup1;
this.hashGroup.Add(groupName,grp);//储存组信息
// 对异步操作设置回调,初始化接口
pIConnectionPointContainer = (IConnectionPointContainer)pobjGroup1;
Guid iid = typeof(IOPCDataCallback).GUID;
pIConnectionPointContainer.FindConnectionPoint(ref iid,out pIConnectionPoint);
pIConnectionPoint.Advise(this,out dwCookie);
}
catch (System.Exception err) //捕捉失败信息
{
error="错误信息:"+err.Message;success=false;
}
finally
{
if (hDeadband.IsAllocated) hDeadband.Free();
}
return success;
}
6、 编写激活、或者取消激活组的函数
在同步编程中对于组的激活或者取消激活没有实质的意义,但在异步通讯编程中却异常重要,这是因为OPC服务器只对当前处于活动状态的组中的变量进行监控,同时这也是很有必要的,因为我们可以把不同界面中的变量编程不同的组,即同一界面中的变量规成一个组,而在某一时刻提供给用户的只有一个界面,让该界面中用到的组处于活动状态,这样执行委托调用时只会执行于该界面中有关的变量检测,而如果让所有的组处于活动状态,则当前没有显示给用户的界面用到的变量若发生变化也会触发对委托函数的调用,这根本是没有必要的,同时会大大降低程序的性能,请严格控制组的激活。
///
/// 激活或者取消激活组
///
/// 指定组名
/// true为激活,false为取消激活
/// 若有错误,返回错误信息
/// 若为true,添加成功,否则添加失败
public bool AciveGroup(string groupName,bool toActive,out string error)
{
error="";bool success=true;
//通过名称获取组
object grp=((groupStru)hashGroup[groupName]).groupObj;
IOPCGroupStateMgt groupStateMgt=(IOPCGroupStateMgt)grp;
//初始化传递参数
IntPtr pRequestedUpdateRate = IntPtr.Zero; //由客户指定的Item更新间隔时间
int nRevUpdateRate = 0; //由服务器返回的能够更新的最短时间间隔
IntPtr hClientGroup = IntPtr.Zero; //客户组
IntPtr pTimeBias = IntPtr.Zero;
IntPtr pDeadband = IntPtr.Zero;
IntPtr pLCID = IntPtr.Zero;
// 激活或者取消激活组
int nActive = 0;
GCHandle hActive = GCHandle.Alloc(nActive,GCHandleType.Pinned);
if(toActive)
hActive.Target = 1;
else
hActive.Target = 0;
try
{
groupStateMgt.SetState(pRequestedUpdateRate,out nRevUpdateRate,hActive.AddrOfPinnedObject(),pTimeBias,pDeadband,pLCID,hClientGroup);
}
catch(System.Exception err)
{
error="错误信息:"+err.Message;success=false;
}
finally
{
hActive.Free();
}
return success;
}
7、 向指定的组中添加变量的函数
///
/// 向指定的组添加一系列项
///
/// 指定组名
/// 完整的item名数组
/// 由服务器返回读写数据时需要使用的item号
/// 无错误,返回true,否则返回false
public bool AddItems(string groupName,string[] itemsName,int[] itemsID)
{
bool success=true;
OPCITEMDEF[] ItemDefArray=new OPCITEMDEF[itemsName.Length];
for(int i=0;i {
hClientItem=hClientItem+1; //客户项自动加1
ItemDefArray[i].szAccessPath = ""; // 可选的通道路径,对于Simatiic Net不需要。
ItemDefArray[i].szItemID = itemsName[i]; // ItemID, see above
ItemDefArray[i].bActive = 1; // item is active
ItemDefArray[i].hClient = hClientItem; // client handle ,在OnDataChange中会用到
ItemDefArray[i].dwBlobSize = 0; // blob size
ItemDefArray[i].pBlob = IntPtr.Zero; // pointer to blob
ItemDefArray[i].vtRequestedDataType = 4; //DWord数据类型
}
//初始化输出参数
IntPtr pResults = IntPtr.Zero;
IntPtr pErrors = IntPtr.Zero;
try
{
// 添加项到组
object grp=((groupStru)hashGroup[groupName]).groupObj;
((IOPCItemMgt)grp).AddItems(itemsName.Length,ItemDefArray,out pResults,out pErrors);
int[] errors = new int[itemsName.Length];
IntPtr pos = pResults;
Marshal.Copy(pErrors, errors, 0,itemsName.Length);
for(int i=0;i {
if (errors[i] == 0)
{
OPCITEMRESULT result = (OPCITEMRESULT)Marshal.PtrToStructure(pos, typeof(OPCITEMRESULT));
itemsID[i] = result.hServer;
pos = new IntPtr(pos.ToInt32() + Marshal.SizeOf(typeof(OPCITEMRESULT)));
}
else
{
String pstrError;
pIOPCServer.GetErrorString(errors[0],0x407,out pstrError);
success=false;
break;
}
}
SetItenClient(groupName,itemsID,itemsID); //要求始终只有一个组被激活,才不会引起冲突。
}
catch (System.Exception err) // catch for error in adding items.
{
success=false;
//error="错误信息:"+error+err.Message;
}
finally
{
// 释放非托管内存
if(pResults != IntPtr.Zero)
{
Marshal.FreeCoTaskMem(pResults);
pResults = IntPtr.Zero;
}
if(pErrors != IntPtr.Zero)
{
Marshal.FreeCoTaskMem(pErrors);
pErrors = IntPtr.Zero;
}
}
return success;
}