首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

s7 数据库

Posted on 2013-05-13 12:42  昕旸灿烂  阅读(774)  评论(0)    收藏  举报

一切从DB2501开始。

TotalCmd文本查询,发现在以下两个文件中包含'DB2501'信息。

  • ombstx\offline\00000004\SUBBLK.DBT
  • AMOBJS\AMDBase.db

SUBBLK为dBase数据文件,可以微软自带的dBase 5.0 ODBC 驱动连接查询。

AMDBase.db文件

  • 原以为是Sqlite文件,但使用SqliteSpy3打开无效;
  • 使用文本文件打开该文件,发现在文件开头包括大段“WATCOM International Corp., Copyright (c) 1987, 1994”字样,查Google判断可能为:
    • Paradox数据库
    • SQL Anywhere数据库
  • 使用微软自带的Parodox ODBC驱动,均打不开该文件;
  • 查Siemens安装确实有安装SQL Anywhere,目录在C:\Program Files\Common Files\Siemens\SQLANY,程序为ASA 9.0.2.3476,因此判定数据文件AMOBJS\AMDBase.db为 ASA 文件。

ASA数据服务本地启动脚本:

1 set path=%path%;"C:\Program Files\Common Files\Siemens\SQLANY"
2 start dbeng9.exe -r -n amdbase AMDBase.db

数据库DBA有密码不知,可参考以下文章修改为sql,之后发现这步不是必须的。

ASA客户端连接方法1,不好用:

1 set path=%path%;"C:\Program Files\Common Files\Siemens\SQLANY"
2 start dbisqlc.exe
  • 配置连接配置以下就好,通过共享内存访问:
    • 登录:用户名dba,密码sql
    • 数据库:服务器名AMDBase

客户端连接方法2,有时不灵:

  • 注册Sybase SQL Anywhere 5.0 ODBC驱动
 1 Windows Registry Editor Version 5.00  
 2   
 3 [HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST.INI]   
 4   
 5 [HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST.INI\ODBC Drivers]   
 6 "Sybase SQL Anywhere 5.0"="Installed"  
 7   
 8 [HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST.INI\Sybase SQL Anywhere 5.0]   
 9 "Driver"="C:\\Program Files\\Common Files\\Siemens\\SQLANY\\WOD50T.DLL"  
10 "Setup"="C:\\Program Files\\Common Files\\Siemens\\SQLANY\\WOD50T.DLL"  

客户端连接方式3,推荐:

  • regsvr32 dbodbc9.dll,然后直接是使用

数据查询工具,推荐:

  • 安装Advanced Query Tool:
  •  Advanced Query Tool相关数据导出:
    • 选择ASA 数据库,如上配置后, 导出DBA.S7UVAttribWinCC 和 DBA.S7UVVariable表数据。
    • 选择Paradox数据库,指定目录ombstx\offline\00000004,导出subblk和baustein表数据。

分析数据

  • S7UVVariable
    • Step7的块信息
SELECT ObjId, State, PVName, BlockTypName, Connection, AddressParam from DBA.S7UVVariable
WHERE ObjId <> 0 ORDER BY ObjId

 

  • S7UVAttribWinCC
    • Step7 与WinCC相关的Tag点
    • 其中有一个Long Binary类型的Data字段,保存了相关Tag点信息,分解字段信息如下:
 1 Select R165005T165001, 
 2   BYTE_SUBSTR(Data,0, 58) AS Name,
 3   BYTE_SUBSTR(Data,59, 102) AS SType, 
 4   BYTE_SUBSTR(Data,161, 4) AS Type,
 5   BYTE_SUBSTR(Data,165, 4) AS ByteLen,
 6   BYTE_SUBSTR(Data,169, 4) AS OutFlag,
 7   BYTE_SUBSTR(Data,173, 4) AS cycy,
 8   BYTE_SUBSTR(Data,177, 4) AS Address,
 9   BYTE_SUBSTR(Data,181, 4) AS Zero1,
10   BYTE_SUBSTR(Data,185, 136) AS BlockTypName,
11   BYTE_SUBSTR(Data,321, 8) AS UNK1,
12   BYTE_SUBSTR(Data,329, 8) AS UNK2,
13   BYTE_SUBSTR(Data,337, 72) AS Zero2
14 From DBA.S7UVAttribWinCC where R165005T165001 = 267 or R165005T165001 = 213
    • 处理好数据的SQL是,返回数据其中
SELECT R165005T165001, 
  CONVERT(CHAR, BYTE_SUBSTR(Data, 0, CHARINDEX( CHAR(0), BYTE_SUBSTR(Data,0, 58)))) AS Name,
  CONVERT(CHAR, BYTE_SUBSTR(Data, 59, CHARINDEX( CHAR(0), BYTE_SUBSTR(Data,59, 102)))) AS SType, 
  CONVERT(INT,BYTE_SUBSTR(Data,164, 1)*power(2,32)+BYTE_SUBSTR(Data,163, 1)*power(2,16)+BYTE_SUBSTR(Data,162, 1)*power(2,8)+BYTE_SUBSTR(Data,161, 1)) AS Type,
  CONVERT(INT,BYTE_SUBSTR(Data,168, 1)*power(2,32)+BYTE_SUBSTR(Data,167, 1)*power(2,16)+BYTE_SUBSTR(Data,166, 1)*power(2,8)+BYTE_SUBSTR(Data,165, 1)) AS Length,
  CONVERT(CHAR,CONVERT(INT,(BYTE_SUBSTR(Data,180, 1)*power(2,32)+BYTE_SUBSTR(Data,179, 1)*power(2,16)+BYTE_SUBSTR(Data,178, 1)*power(2,8)+BYTE_SUBSTR(Data,177, 1))/16))
      +'.'+ CONVERT(CHAR,MOD(CONVERT(INT,BYTE_SUBSTR(Data,177, 1)),16)) AS Address,
  CONVERT(CHAR, BYTE_SUBSTR(Data, 185, CHARINDEX( CHAR(0), BYTE_SUBSTR(Data,185, 136)))) AS BlockTypName
FROM DBA.S7UVAttribWinCC where R165005T165001 = 267 or R165005T165001 = 213
      • Type:BOOL/1;BYTE/3;INT/4;WORD/5;REAL/8;STRING/10;