浔之漫智控技术(上海)有限公司
    关于我们
  • 企业文化 组织结构 分支公司 售后服务 技术支持
  • 西门子PLC模块6ES7212-1BB23-0XB8工厂直销
  • 西门子PLC模块6ES7212-1BB23-0XB8工厂直销
  • 西门子PLC模块6ES7212-1BB23-0XB8工厂直销

产品描述

品牌西门值+ 包装说明 全新 - 产品规格子 现场安装

西门子PLC模块6ES7212-1BB23-0XB8工厂直销

使用面板类型的人机界面 
尽量在自动化系统中使用面板类型的人机界面来代替单一的按钮指示灯,虽然按钮指示灯的功能是无法保密的,但目前为止,面板型人机界面能够实现程序上载并实现反编译的产品还不多见,开发者可以在面板的画面上加上明显的厂家标识和联系方式等信息,者还不至于傻到连这个也原样照抄吧。这样迫使者必须重新编写操作面板的程序甚至于PLC的程序,而开发者则可利用面板和PLC数据接口的一些特殊功能区(如西门子面板的区域指针,或VB脚本)来控制PLC的程序执行。这样的PLC程序在没有HMI源程序的情况下只能靠猜测和在线监视来获取PLC内部变量的变化逻辑,费时费力,极大的增加了的难度。 

4. 采用高级语言编写部分重要的工艺程序 
这一点主要针对采用S7-300/400或WI产品的控制设备,除了使用STEP 7提供的LAD,STL,FBD标准编程语言来开发控制程序,我们还可以使用SCL,S7-GRAPH等高级语言来开发一些重要的工艺程序,WI还可以使用ODK软件包开发出专有的程序块。一般的者是不容易搞到这些开发工具的,即使有也不一定会使用,更不用说来读懂这些程序了。 

 在项目具体实施的过程中,我们应该从软件开发技巧的度来考虑PLC控制程序的保护: 

1. 编程方式的采用 
a) 采用模块化的程序结构,采用符号名,参数化来编写子程序块 
b) S7-300/400尽量采用背景数据块和多重背景的数据传递方式 
c) 多采用间接寻址的编程方式 
d) 复杂系统的控制程序尤其是一些带有顺序控制或配方控制的程序,可以考虑采用数据编程的方式,即通过数据的变化来改变系统的控制逻辑或控制顺序。 

用户应该尽量采用以上几种高级层次的编程方式,这样编出来的程序中嵌入系统的保护加密程序,才不容易被发现和破解 

2. 主动保护方法 
a) 利用系统的时钟 
b) 利用程序卡或者CPU的ID号和序列号 
c) 利用EEPROM的反写入功能,及一些需要设置的内存保持功能 
d) 利用系统提供的累时器功能 
e) 在用户程序的数据块中设置密码 
f) 软件上设置逻辑陷阱 
g) 可以反向利用自己在编程时犯的错误 

3. 被动保护方法 
a) 在内存容量利用许可的条件下,不要删除被认为是无用的程序 
b) 在数据块里留下开发者的标识,以便于将来遭到侵权时可以取证 

4. 应用反技术的注意事项 
a) 在用户程序中嵌入保护程序要显得自然一些,不能很突兀的加出一段程序来,代码要尽量精简,变量符号名应与被嵌入程序段的变量保持一致 
b) 往往一种保护加密手段是不够的,应该多种方法并用,并且这些保护程序一旦后对系统造成的后果也应该尽量不同,造成所谓的“效应”,从而增加程序被的难度,时间与成本,短时间内让者束手无策, 
c) 保护好程序的原代码,如果需要交付程序的,在不影响用户对设备维护的前提下,应对交付的程序做适当的技术处理,如删除部分符号名,采用上载的程序或数据块 
d) 做好严格的测试,以避免保护程序的不完善引起的误动作而带来的不必要的麻烦,同时也能降低售后服务的的费用 

 运用保护手段的原则 

我们虽然掌握了一些加密保护的手段,有一点必须明白,密码和锁的道理是一样的,没有打不开的锁,也没有解不开的密码,我们从技术上采取的措施来防止侵权的作用还是十分有限的,因此大家不能把所有的希望都寄托在所谓的加密技术或与反技术上;除此之外我们还可以通过专利的申请等其他诸如法律手段来保护我们的知识产权;但*重要的是我们不能安于现状,而是要勇于创新,不断地利用新技术开发新产品,占领技术新高地,争做的领头人,才能使我们的企业立于不败之地。


一直看到有些朋友在问ModBus主从站的通讯问题,今天抽空儿给大家发几篇。

事先申明,我是调用的主从站库,库本身并不是我编写的,我没有那么大的能耐。

另外,上位机是用VB编写,VB本身不是很熟,如果有什么错误,请大家海谅。

*后,这仅仅只是一个测试程序,如果各位想用到商业方面,还需要各位自己去完善。

说明:PLC从站,PC作主站,用ModBus协议进行通讯。PC机读取PLCVW区的数据;PC机还读取PLC内部I或者O地址的状态。

///////////////////////////////////////

以下是PLC程序实现,方便贴出,已转换为STL

TITLE=程序注释

Network 1 // 网络标题

// 在第一个循环周期内初始化Modbus从站协议

LD SM0.1

CALL SBR3, 1, 12, 9600, 0, 0, 128, 32, 1000, &VB0, M10.1, MB11

Network 2 

// 在每个循环周期内执行Modbus 从站协议

LD SM0.0

CALL SBR1, M10.2, MB12

Network 3 

LD SM0.0

MOVW AIW0, VW100

/I +54, VW100

MOVW AIW2, VW102

/I +54, VW102

MOVW AIW4, VW104

/I +54, VW104

MOVW AIW6, VW106

/I +54, VW106

Network 4 

LD SM0.0

= Q0.0

Network 5 

LD I0.0

= Q0.1

Network 6 

LD I0.1

= Q0.2

///////////////////////////////////

以下是VB源码

Option Explicit

Private Declare Function GetTickCount Lib "kernel32" () As Long

Dim x1

Dim p11, p12, p13, p14, p15, p16, p17, p18

Function CRC16(data() As Byte) As bbbbbb

Dim CRC16Lo As Byte, CRC16Hi As Byte 'CRC寄存器

Dim CL As Byte, CH As Byte '多项式码&HA001

Dim SaveHi As Byte, SaveLo As Byte

Dim i As Integer

Dim Flag As Integer

CRC16Lo = &HFF

CRC16Hi = &HFF

CL = &H1

CH = &HA0

For i = 0 To UBound(data)

CRC16Lo = CRC16Lo Xor data(i) '每一个数据与CRC寄存器进行异或

For Flag = 0 To 7

SaveHi = CRC16Hi

SaveLo = CRC16Lo

CRC16Hi = CRC16Hi \ 2 '高位右移一位

CRC16Lo = CRC16Lo \ 2 '低位右移一位

If ((SaveHi And &H1) = &H1) Then '如果高位字节*后一位为1

CRC16Lo = CRC16Lo Or &H80 '则低位字节右移后补1

End If '否则自动补0

If ((SaveLo And &H1) = &H1) Then '如果LSB为1,则与多项式码进行异或

CRC16Hi = CRC16Hi Xor CH

CRC16Lo = CRC16Lo Xor CL

End If

Next Flag

Next i

Dim ReturnData(1) As Byte

ReturnData(0) = CRC16Hi 'CRC高位

ReturnData(1) = CRC16Lo 'CRC低位

CRC16 = ReturnData

End Function

Private Sub About_Click()

frmAbout.Show

End Sub

Private Sub bbbb_Load() '初始化

Timer1.Enabled = False '定时器1无效

Timer1.Interval = 1000 '定时器1时间为1S

Timer2.Enabled = True '定时器2有效

Timer2.Interval = 1000 '定时器2时间为1S

Text1.Text = ""

Text2.Text = ""

Text3.Text = ""

Text4.Text = ""

Text5.Text = ""

Text6.Text = ""

Text8.Text = ""

Text10.Text = ""

mPort = 1 '设定端口号

MSComm1.Settings = "9600,n,8,1" '设定通讯波特率

MSComm1.InBufferSize = 1024 '接收缓冲器大小

MSComm1.OutBufferSize = 1024 '输出缓冲器大小

MSComm1.bbbbbMode = combbbbbModeBinary '以二进制传输

MSComm1.RThreshold = 1 '

MSComm1.SThreshold = 0

MSComm1.bbbbbLen = 0 '读取接收缓冲器所有字符

MSComm1.OutBufferCount = 0 '清空发送缓冲区

MSComm1.InBufferCount = 0 '清空接收缓冲区

If MSComm1.PortOpen = False Then

Command3.Caption = "打开串口"

Else

Command3.Caption = "关闭串口"

End If

End Sub

Private Sub Command1_Click()

Timer1.Enabled = True

End Sub

Private Sub Command2_Click() '退出程序,定时器1无效

Timer1.Enabled = False

Cls

Unload Me

End Sub

Private Sub Command3_Click()

On Error Resume Next

If MSComm1.PortOpen = False Then

MSComm1.PortOpen = True

Else

MSComm1.PortOpen = False

End If

If MSComm1.PortOpen Then '打开关闭按钮显示文字

Command3.Caption = "关闭串口"

Else

Command3.Caption = "打开串口"

End If

If Err Then '打开串口失败,则显示出错信息

MsgBox Error$, 48, "错误信息"

Exit Sub

End If

End Sub

Private Sub Timer1_Timer() '读V存储区数据

Dim CRC() As Byte

Dim FGetData As bbbbbb

Dim aa() As Byte

Dim s As bbbbbb

Dim str As bbbbbb

Dim i As Integer

Dim bb, cc As bbbbbb

ReDim aa(5) As Byte '定义动态数组

aa(0) = &HC

aa(1) = &H3

aa(2) = &H0

aa(3) = &H32

aa(4) = &H0

aa(5) = &H4

CRC = CRC16(aa)

str = CRC

s = ""

For i = 1 To LenB(str)

s = s + Hex(AscB(MidB(str, i, 1)))

Next i

bb = Right(s, 2)

cc = Mid(s, 1, 2)

If Len(s) < 4 Then

cc = Mid(s, 1, 1)

End If

ReDim Preserve aa(0 To 7) As Byte

aa(6) = Val("&H" & bb)

aa(7) = Val("&H" & cc)

MSComm1.OutBufferCount = 0 '清空输出寄存器

MSComm1.Output = aa

FGetData = ReceiveData

Text5.Text = FGetData

p11 = Val("&H" & Mid(FGetData, 7, 4))

p12 = Val("&H" & Mid(FGetData, 11, 4))

p13 = Val("&H" & Mid(FGetData, 15, 4))

p14 = Val("&H" & Mid(FGetData, 19, 4))

End Sub

Private Sub Command4_Click() 'I状态

Dim CRC() As Byte

Dim FGetData As bbbbbb

Dim aa() As Byte

Dim s As bbbbbb

Dim str As bbbbbb

Dim i As Integer

Dim bb, cc As bbbbbb

ReDim aa(5) As Byte '定义动态数组

aa(0) = &HC

aa(1) = &H2

aa(2) = &H0

aa(3) = &H0

aa(4) = &H0

aa(5) = &H1

CRC = CRC16(aa)

str = CRC

s = ""

For i = 1 To LenB(str)

s = s + Hex(AscB(MidB(str, i, 1)))

Next i

bb = Right(s, 2)

cc = Mid(s, 1, 2)

If Len(s) < 4 Then

cc = Mid(s, 1, 1)

End If

ReDim Preserve aa(0 To 7) As Byte

aa(6) = Val("&H" & bb)

aa(7) = Val("&H" & cc)

MSComm1.OutBufferCount = 0 '清空输出寄存器

MSComm1.Output = aa

FGetData = IReceiveData

p17 = Val("&H" & Mid(FGetData, 7, 2))

p18 = Val("&H" & Mid(FGetData, 9, 2))

End Sub

Private Sub Command5_Click() 'Q状态

Dim CRC() As Byte

Dim FGetData As bbbbbb

Dim aa() As Byte

Dim s As bbbbbb

Dim str As bbbbbb

Dim i As Integer

Dim bb, cc As bbbbbb

ReDim aa(5) As Byte '定义动态数组

aa(0) = &HC

aa(1) = &H1

aa(2) = &H0

aa(3) = &H0

aa(4) = &H0

aa(5) = &H1

CRC = CRC16(aa)

str = CRC

s = ""

For i = 1 To LenB(str)

s = s + Hex(AscB(MidB(str, i, 1)))

Next i

bb = Right(s, 2)

cc = Mid(s, 1, 2)

If Len(s) < 4 Then

cc = Mid(s, 1, 1)

End If

ReDim Preserve aa(0 To 7) As Byte

aa(6) = Val("&H" & bb)

aa(7) = Val("&H" & cc)

MSComm1.OutBufferCount = 0 '清空输出寄存器

MSComm1.Output = aa

FGetData = QReceiveData

p15 = Val("&H" & Mid(FGetData, 7, 2))

p16 = Val("&H" & Mid(FGetData, 9, 2))

End Sub

Private Function ReceiveData() As bbbbbb '返回V存储器区数据

Dim FGetData As bbbbbb

Dim t1 As Long

Dim av As Variant

Dim i As Integer

Dim ReDataLen As Integer

FGetData = ""

t1 = GetTickCount() '取时间,做延时用



http://www.absygs.com

产品推荐