Skip navigation
All Places > All Things PI - Ask, Discuss, Connect > PI Square中文论坛 > Blog > Author: hzhao

PI Square中文论坛

7 Posts authored by: hzhao Employee

接上一篇有关AF analytics的最佳实践 - Part1

 

如何实现含有过滤条件的平均值(Average)、总值(Total)和汇总(Rollup)计算

关于这个内容有一篇KB文章 KB01120

下面这个例子中我们想要计算流量大于0(FlowRate > 0)时的流量的平均值(事件加权以及事件加权),仅靠TagAvg()和TagMean()函数不能实现这个功能。

m1.jpg

m2.jpgm3.jpg

要获得正确的时间加权平均,我们需要创建另外一个属性,比如叫做Filtered Flowrate,然后使用Formula 数据引用类型如下图所示:

m4.jpg

时间加权平均值的计算:使用TimeGT()函数来计算Flowrate属性在过去一天中大于0的时间。这个结果的单位是秒(s),因此我们还需要把它转化成为天(d),即PumpRunningInDays变量,接着TagTot()函数来计算Filtered Flowrate属性过去一天的总值。将两者得到的结果相除就得到Filtered Time weighted Average了。

m5.jpg

m6.jpg

事件加权平均值的计算:我们需要创建一个新的属性,在FlowRate > 0时,显示原来的值,当flowRate = 0时,显示NoOutput()

m7.jpg

接着对FilteredFlow这个属性使用TagMean()函数即可计算经过过滤以后的事件平均

m9.jpg

 

汇总计算:

同理,通过创建Filtered Production这样的属性可以对production属性的值进行过滤,并将这个值用在Rollup的计算中,即可得到过滤后的rollup的值

n1.jpg

n2.jpg

n3.jpg

n4.jpg

 

高级回填选项:

写入PI的时间戳可以是触发事件的未来时间

o1.jpg

 

如何在表达式中使用时间

这个例子中我们想要计算Volume1中的变化率,以及变化的持续时间

p1.jpg

其中st和et记录了Volume1属性的开始时间和结束时间,DateTime变量是两者之间的时间差,格式是dd:hh:mm:ss。这个结果用在ROC的计算中,并得到一个结果。DateTime变量已经被转换为秒(s),这样ROC的单位是(bbl/sec)。但当您想把这个结果映射到属性是会有下面这个错误

p2.jpg

但是,Raw Delta Time的数据类型是DateTime,没办法定义UOMs。

这里的trick是可以使用Float()函数,使用Float()可以将Delta Time变量改为double。接着可以使用Convert()函数给DeltaTimeInHours变量添加单位,然后进行rate of change(ROC)的计算。

p3.jpg

 

根据需求计算(结果不写入PI点)

AF Client (AFSDK)2.7开始,AF中多了一种新的数据引用类型,Analysis,该引用会记录表达式,但只有在客户端query的时候才会计算结果

q1.jpg

对于这种数据引用类型有如下一些内容需要考虑:

  • 计算是在AF客户端进行的
  • 计算频率是不是过于频繁?
  • 这个按需求计算是不是依赖于别的其他的按需求计算?
  • 在一个数据请求中有多少这样的计算?
  • 数据请求的间隔是多少?

以上这些因素都是影响性能的,所以这种数据引用类型应该被谨慎地使用

 

被限制使用的函数——这些函数可以被使用,但不支持summary data calls:

  • EventCount()
  • PctGood()
  • Range()
  • StDev()
  • TagAvg()
  • TagMax()
  • TagMean()
  • TagMin()
  • TagTot()

在下面这个例子中,我们计算Flow属性的5分钟平均值,并将结果映射到属性average flow。这个结果没有被映射到一个PI点,但我们仍然可以在一段时间内计算他们的值。请见下图:

 

 

q2.jpg

q3.jpg

q4.jpg

但如果您想将这个属性用于另外一个表达式的时候会得到下面这个报错,因为这个结果不能再被用于新的summary call函数中

q5.jpg

如果我们创建一个变量AvgFlowHist将计算结果映射到一个PI点中,AvgFlowHist可以被用于计算tagtot

q8.jpg

 

下列函数是不能在按需求计算中使用的,因为这些函数计算时比较消耗资源:

  • DeltaValue()
  • FindEq()
  • FindGE()
  • FindGT()
  • FindLE()
  • FindLT()
  • FindNE()
  • HasValueChanged()
  • NumOfChanges()
  • TimeEq()
  • TimeGE()
  • TimeGT()
  • TimeLE()
  • TimeLT()
  • TimeNE()
  • NoOutput()

q9.jpg

最近在pisquare上有同事发了有关AF Analytics的最佳实践的系列文章,以及一个文档(请见附件),全文比较长,下面挑选几个我认为比较重要或者新的内容介绍一下。

原文连接:

Tips and Tricks for Asset Based Analytics

Creating Analytics in Element Templates

Using Categories in Analytics

Make AF Analytics more readable - Break up your calculations

AF Analytics - Preview Results

AF Analytics - Bad and/or Stale Value Filters

AF Analytics - Pass parameters using Attributes

AF Analytics - NoOutput() Function

AF Analytics - Triggers for Event Frames and Notifications

AF Analytics - Units Of Measure (UOMs) in Equations

AF Analytics - Commenting your work

AF Analytics - Filtered calculations

AF Analytics - Advanced write back

AF Analytics - Working with date-time arithmetic

AF Analytics - On Demand calculations

AF Analytics - How to use Attributes from other Elements

 

如何避免个别Analysis在用模板创建的过程中自动启动

在AF 2.8之前,当我们check in对Analysis的修改之后,分析都会自动启动,而有时我们并不想这么做(可能只是想保存所做的修改)。

在AF 2.8或今后版本中,我们加入了一个新的功能,使得这个问题变得简单。您可以选择反选Start analyses when created from a template。这样,Analyses在被手动启动之前不会被启动。

A6.jpg

对于2.8或之前版本有一个tricky的方法,可以参考原文链接Creating Analytics in Element Templates

 

使用分组(Category)功能

将分析分组之后可以更方便的在Analyses plugin中进行管理,而且一个分析可以归属于多个组(category)。比如,下面这个例子中,我们有一个PI AF database,叫做Refinery,有许多Analyses,当我们用模板(Template)来分组时:

B1.jpg

但,如果我们想要backfill所有的Simulation的analyses,靠Analysis Template和Status(运行状态)来筛选就没有办法做到。如果有了合适的分组,就可以通过Category过滤来很方便的找到所有想要启动的分析

B2.jpg

 

让你的计算更有可读性和更容易理解 - 拆分您的计算:

1. 将您的计算分到多个变量中:

下面这个表达式就很长,很不易读

C1.jpg

可以把表达式分拆成多个变量,如下:

C2.jpg

2. 将您的表达式分到多个行中:

C3.jpg

可以通过Shift-Enter来把上面的表达式分行,使之更加可读

C5.jpg

C4.jpg

3. 使用变量来创建您的计算

C5.jpg

上面这个表达式有很多地方使用了重复的表达式(如下面P、T、Dens这三个变量),如果把这些表达式定义为变量,那会使得整个表达式更加可读

C6.jpg

 

预览结果

在启动、回填分析之前,最好都能够预览一下您的结果。只需要选择分析,并右键点击,选择Preview results即可。(注意:分析表达式必须没有syntax error,如果您是用模板创建分析,您需要选择一个样板元素-Example Element)

D1.jpgD2.jpg

在预览中,您将会看到触发的时间戳,所有变量的值(包括所有中间变量,这个例子中,PumpOn、PumpOff、Flowing、Status,而不仅仅是输出最终结果的Staus变量)。

D3.jpg

另外,和常识不同,预览并不需要签入(check in)分析,事实上,在创建分析的过程中频繁签入并不是十分高效的做法,而且每次签入之后,所有在运行的analyses将会重新启动。当看到预览结果之后,您还可以将结果导出到excel中,选择Export Results即可。

D4.jpg

 

坏的以及停滞不变的值

坏的值(Bad Value)和停滞的值可能导致计算失败,或者很多无意义的结果。在写表达式的时候可以通过一些方式来规避他们的影响。

E1.jpg

坏值:通过BadVal来过滤No Data,当BadGasFlow为真的时候,没有结果被写入FixedFlow属性(NoOutput())。

E2.jpg

停滞不变的值:

可以使用HasChanged()函数,使用这个函数的时候需要注意,否则会出现不正确的结果,下面这个例子中,属性Trigger在PI Archive中的值如下图所示,注意到它上一个归档值和前一个值相同,并且已经是在10分钟以前了

E4.jpg

我们现在用HasChanged()来写表达式,并预览,我们可注意到显然最后一个值(在8月3日12点57分53秒的值)显然应该为False

E5.jpg

这是因为这个属性Trigger是被用作触发的,每当这个表达式被出发,有一个新的值会在PI Archive中,所以这个表达式会返回True,尽管实际上这个值并没有改变。

E6.jpg

如果我们修改一下表达式,新加入一个属性,比如Pressure,我们可以用这个属性来触发。这时我们可以得到我们想要的结果。

E7.jpgE8.jpgE9.jpg

什么时候不要使用HasChanged()函数:如果想要用Trigger属性的变化来触发计算,HasChanged()不应该被使用。可以使用prevVal来替代。(尽管不是十分精确)

E11.jpg

 

让您的计算更具适用性,尽量使用属性来传递值,避免写死的数字。

传递时间参数:

F1.jpg

下面两个表达式,分别使用EndTime/OffSet和EndTime/StartTime来计算体积的平均值(您需要使用parseTime()函数,来将string型的原数据转换为时间的格式)

F2.jpg

写死的表达式不需要使用ParseTime()函数,但是灵活性不强。如下:

F3.jpg

传递控制限参数:

子属性最合适用在,关联的PI tag名字、控制限、说明等与父元素相关的地方。这里我们添加了最大值、最小值的子属性,并在计算中引用了这两个属性(Mass|Maximum, Mass|Minimum)。

F4a.jpgF5a.jpg

您也可以在右边Attributes导航栏中找到相应的元素,选择插入相对路径(Relative)

F6.png

 

NoOutput()函数的使用

有的时候NoOutput()可能不会给出期待的结果,参见 KB01127不过这个情况是有意为之的),但大多数时候,使用NoOutput()可以节省资源,如下面这个例子

 

 

G1.jpg

使用NoOutput()函数之后,大大减少了输出的结果,如果这个输出结果要用于新的分析的trigger condition并使用natural trigger,那使用NoOutput()函数之后可以大大减少检查触发条件的次数。

G2.jpg

 

给事件框架和报警创建相同的触发条件

从今年第四季度将会发布的PI AF 2.8.5开始,Notification将会成为Event frame的扩展,采用下面的方法可能就不是必须了。

下面的例子中,我们将在Pump开(On)、关(Off)时触发事件和报警。首先分别创建事件框架和报警的模板

 

H1.jpg

H2.jpg

H3.jpg

 

H4.jpg

创建Pump Status分析来记录Pump的on或者off状态发生切换时的值

H5.jpg

接下来创建事件框架分析来生成相应的事件。

H6.jpg

H7.jpg

 

在计算中指定单位(UOM)以保证获得正确的结果:

比如我们用体积(Vol)和密度(Den)计算质量,现在所有的单位都是匹配的,最终可以得到以磅(lb)为单位的质量

k1.jpg

k2.jpg

但如果我不小心将Mass属性的单位从磅(lb)改为了千克(kg),则我们会得到错误的结果

k3.jpg

但如果我们添加如下新的变量在表达式当中,并将这个新的结果map到Mass属性,则最终得到的结果会是正确的。

k5.jpg

关于UOM的行为, KB01366有更详细的说明

 

给分析添加注释

使用“//”来添加注释

l2.jpg

如果要添加多行注释,可以使用Shift-Enter换行,或者使用“/*”和“*/”

l3.jpg

l4.jpg

余下内容在Part2中继续

接上一个系列:Coresight 系列讨论 - Coresight 安装 ,原文链接为:Coresight Squared – What’s next? Kerberos and more..

 

该系列目前包括三部分:

Server核心版的安装和配置

PI Coresight的安装

Kerberos配置及更多 << 您在这

 

到这里,Coresight已经可以使用了,不过我们这个系列还没有结束,我们将会谈谈大家最喜欢的三头怪(Kerberos是希腊神话中的一个三头狗)Kerberos

声明:

这篇文章中不会涉及Kerberos端口如何工作的技术细节,也不会包含Kerberos的troubleshooting。(可能会在下一次会谈)。与之对应的是我们会将如何利用Kerberos认证和Kerberos委任来加强PI系统的安全性。

 

Coresight - IIS 设置

 

在配置 Kerberos之前,确保 Kerberos 验证在PI Coresight 上是可行的。

 

1. 启用 Windows Authentication(Windows 认证)

选择 Coresight Web Application > Authentication Settings:

2. 启用 Kernel-mode Authentication

右键点击 Windows Authentication > Advanced Settings... > 确保Kernel-mode authentication是被启用的:

 

 

 

 

按照上面的描述,Microsoft 推荐保持启用Kernel-mode 认证。一些关于Kernel-mode 认证对于性能的好处的数据可以在这里看到

 

如果Kernel-mode 认证被:

  • 启用, Kerberos 票据默认用Local System 账户解码.
  • 禁用, Kerberos 票据默认用app pool 账户解码.


这样的话,如果Coresight AppPools以如下用户运行:

  • 虚拟或者机器账户 (比如Network Service) - 不需要更多操作

 

  • 自定义域账户 - 启用 AppPool 账户来解码 Kerberos 票据:
    IIS Manager 中,选择Coresight Web Application > Configuration Editor > 导航到 system.webServer/security/authentication/windowsAuthentication > 设置 useAppPoolCredentialsTrue。这保证了 AppPool 用户是被用户解码传数过来的Kerberos票据的,允许Kerberos认证可以正常工作。

 

3. 使 Kerberos 认证 成为可能

右键点击 Windows Authentication > Providers... > 确保 Negotiate provider是列表中的第一个选项. 比如:

 

Kerberos 简化版: “三个头”

为了尽可能简化,让我们考虑三个主要的关注点:

1. 前端服务器主体名称(SPN,Service Principal Name) - Coresight 终端用户需要能够使用 Kerberos 认证来登录 Coresight (前端服务)

2. 端服务器主体名称(SPN,Service Principal Name)PI 或者 AF Server ( 后端服务) 需要可以接受Kerberos请求 (委任的凭据)

3. Kerberos 委任 - Coresight 服务用户 (前端服务身份) 需要被允许去委任终端用户的凭据给后端服务 (PI or AF Server)

 

第一头: 前端服务器主体名称


一个服务器主体名称是一个服务实例唯一标识符。 服务器主题名称(SPNs)被Kerberos 认证用于将一个服务实例和服务账户联结起来。

服务主体名称能够被分成两部分(这里省略了端口号和服务名,因为它们和我们的内容不大相关)

 

服务类/目标主机, 被安排到一个合适的服务账号.

 

服务类(ServiceClass) – 一个指明服务普通类的字符串。和PI系统有关的常用的服务类包括:

PI Data Archive – PIServer

PI AF Server – AFServer

PI Coresight – HTTP

无论Coresight是不是用了SSL,服务类都是HTTP!

 

目标主机(TargetHost) - 服务运行的机器的主机名和全域名。对Coresight服务器总是既创建两个服务主体名称(SPN)一个给主机名,另一个给全域名!

 

服务账号(ServiceAccount) – 运行服务的用户,如果是:

域账户 - 服务器主体名称(SPN)是被安排给实际存在的运行服务的域用户

虚拟或者机器账号 (Network Service, NT Service\Service 等.) – 服务器主体名称(SPN)被安排给计算机(服务在运行的那台)

 

服务器主体名称(SPNs)可以用 setSPN.exe 工具来创建 (在命令行中可用). 在大多数环境下,创建新的服务器主体名称需要域管理员的权限

 

为了OSI\CoresightSVC 运行的PI Coresight 创建服务器主体名称(SPN), 在 Core01.it.local 机器上运行:

setspn -S HTTP/Core01.it.local OSI\CoresightSVC  
setspn -S HTTP/Core01 OSI\CoresightSVC

为了用Network Service运行的PI Coresight 创建服务器主体名称(SPN),在Core01.it.local 机器上运行:

setspn -S HTTP/Core01.it.local Core01  
setspn -S HTTP/Core01 Core01  

 

用setSPN.exe来验证是否服务器主体名称(SPNs)已经被正确创建和安排。

 

列举安排给某一个域账户所有的服务器主体名称(SPNs):

setspn -L domain\account  
Example: setspn -L OSI\CoresightSVC 

 

检查特定的SPN是否存在

setspn -Q SPN  
Example: setspn -Q HTTP/Core01  

 

第二头: 后端服务器主体名称

 

相同的适用于前端的服务器主体名称的原则也适用于后端。保证合适的 (PIServer/TargetHost and AFServer/TargetHost, 分别) SPNs 被安排给正确的服务用户 (PI Network Manager 服务账号 对应PI Data Archive; PI AF Application Service 的服务账号 对应AF的).

 

第三头: Kerberos委任

 

一旦Kerberos委任被启用,前端服务 (PI Coresight) 可以委任终端用户的凭据给后端服务 (PI Data Archive 或者 PI AF Server) 从而保证终端用户用安全的方法读取后端的数据。

 

在我们的案例中, Coresight 服务用户需要被允许委任终端用户的凭据给 PI Data Archive. 从PI Coresight 2016开始,对AF Server的Keberos 委任对于给Event Frame添加注释是必须的。

 

有三种主要的Kerberos委任的方式:

  • 通常的 (不约束的) 委任
  • 约束委任


  • 按资源的委任

要了解更多信息,请参阅 KB01222 - Types of Kerberos Delegation. 我们将使用最新的方式 – 按照资源的委任。这种方法有多个好处,主要有:

  • 用于委任的权限与后端关联而不是前端
  • 不需要域管理员特权
  • 可以跨域或者跨森林工作

这对于非IT管理员用户是一个非常好的消息,因为它允许后端资源的管理员,如PI Data Archive和PI AF的管理员来控制是否这些资源接受被委任的凭据。 但是要使用基于资源的约束委任也有一些要求。

  • 前端和后端账户域都必须有Server 2012或更高等级的Kerberos分配中心
  • 前端服务器必须安装在Windows Server 2012或更高版本的操作系统上

 

要配置基于资源的约束委任,在Powershell中使用活动目录命令集

下面的例子是给 用域用户 picoresight 运行的PI Coresight和用默认虚拟账户NT Service\AFService 运行的AF Server PIAF01

 

分步指导:

 

1. 获得前端和后端服务标识。如果服务用一个域账户运行,用Get-ADUser。如果用机器账号如 Network Service 或者一个虚拟账号运行, 使用 Get-ADComputer.

$frontendidentity = Get-ADUser -Identity picoresight  
$backendidentity = Get-ADComputer -Identity PIAF01 

2. 安排 front-end identity(前端标识)back-end identity(后端标识)  PrincipalsAllowedToDelegateToAccount 属性

 

Set-ADComputer $backendidentity -PrincipalsAllowedToDelegateToAccount $frontendidentity 

 

3. 观察更新后的后端身份标识的 PrincipalsAllowedToDelegateToAccount 属性,验证它是被合理设置的:

 

Get-ADComputer $backendidentity -Properties PrincipalsAllowedToDelegateToAccount 

 

 

另外:

 

允许多个主体委任给相同的后端,设置 PrincipalsAllowedToDelegateToAccount 给所有需要的标识,以逗号隔开:

 

Set-ADComputer $backendidentity -PrincipalsAllowedToDelegateToAccount $frontendidentity1, $frontendidentity2 

 

 

如果有多个域参与其中,当指定Get-ADUser时指定更多标准,下面这个例子包含了-Server 参数来指定一个标识所在的域控制器:

$frontendidentity = Get-ADUser -Identity picoresight -Server piDC01.pidoge.local 

 

推荐 Kerberos 阅读

OSIsoft: Kerberos Authentication and web browsers

How Windows Server 2012 Eases the Pain of Kerberos Constrained Delegation, Part 1

How Windows Server 2012 Eases the Pain of Kerberos Constrained Delegation, Part 2

If there are multiple domains involved, specify more criteria when executing the Get-ADUser cmdlet. The example below includes the -Server parameter to specify a DC of the domain where the identity resides:

接上一个系列:Coresight 系列讨论 - 在Windows Server核心版安装和配置 ,原文连接为Coresight Squared - Coresight Installation

 

整个系列包括以下3部分:

Coresight 系列讨论 - 在Windows Server核心版安装和配置

PI Coresight安装 << 您现在这里

Kerberos以及更多

 

服务账号

 

在开始安装PI Coresight之前,先准备一个合适的服务账号。为了遵循最小权限的原则,建议准备三个分开的账号:

  1. 运行两个Coresight AppPools的域账号
  2. 运行PI WebAPI Service的域账号
  3. 运行PI Crawler Service的域账号

 

需要的权限:

 

PI Coresight服务账号

- 所有PI Coresight将会需要读取的AF和PI Data Archive内容的读取权限

- 任意PI ProcessBook画面导入文件夹的读取权限

 

PI Crawler 服务账号

- PI Data Archive中PIUSER, PIDBSEC, PIPOINT, PIMAPPINGS 表格的读取权限

- 所有PI Coresight用户将会需要搜索的AF和PI Data Archive内容的读取权限

 

PI Web API 服务账号

- 可以连接任意PI Coresight用到的PI或者AF服务器 (为了 PI Crawler可以成功生成索引)

- AF中事件框架的读取权限(事件框架不被crawler索引, PI Coresight 直接通过PI Web API搜索事件框架)

 

PI Coresight 安装

 

附件中的 setup.ini file (或从pastebin获取)是在Server核心版中安装PI Coresight的钥匙。这个setup 文件已经被修改过了,所以服务器角色和功能的检查已经被跳过了,PI Buffer Subsystem模块也被从安装过程中移除了,因为PI Coresight不需要它。

 

关于 .NET Framework 4.6的重要说明:

考虑到大量关于在安装.Net Framework 4.6过程中报告的缺少前置组件的报告,在安装PI Coresight之前先通过Windows 更新安装,NET Framework 4.6是一个比较好的方案

 

有两种方式完成这一点:

1) 慢:等待Windows更新自动安装

Windows更新是以自动模式运行的(我们在Coresight 系列讨论 - 在Windows Server核心版安装和配置 中已经提到),所以最终所有需要的更新都会被安装。

 

2) 快:在Server核心版上强制执行一个手动更新

要加快这个进程,将Windows Update切换到手动模式,并立刻安装所有可用的更新To speed up the process, switch Windows Update to Manual mode and installed all available Updates immediately:

a) 打开 sconfig > 选择 Option 5 – Windows Update Settings(Windows 升级设置) > 输入 m 切换 Windows Update 到手动模式。

 

b)sconfig 主菜单, 选择 Option 6 – Download and Install Updates(下载和安装更新) > 输入 a 来搜索所有的更新 > 再次输入 a 来安装所有的更新。

有些更新可能需要重启。上述步骤可能需要重复几次直到安装.NET Framework 4.6

 

c) 将Windows 更新切换回到自动模式 (sconfig > 选择 Option 5 – Windows Update Settings (Windows 升级设置)> 输入 a 切换Windows 更新到自动模式)

 

如果您想手动安装,当在Server核心版安装 .NET Framework 4.6 需要使用/q 开关 (静默安装) 。
这样安装将会通过运行 NDP46-KB3045557-x86-x64-AllOS-ENU.exe /q开始。因此,为了以防万一, /q 开关在修改过的 setup.ini 已经包含了

 

按照如下步骤进行操作:

 

1. 替换setup.ini

 

i. 在任意电脑上,运行PI Coresight的安装包,将其解压到一个文件夹(让我们把他叫做installsrc),并且在安装任何组件之前取消安装.

ii. 到 installsrc 路径中用修改过的setup.ini文件替换原有的setup.ini文件。

 

 

2.  将 installsrc 文件夹拷贝到Server核心版的机器上并安装Coresight。

 

使用Robocopy (在命令行中可用) 或者在Windows Explorer当中使用复制粘贴功能。

 

比如,从本地 C:\Temp拷贝Coresight 2016 安装文件夹到一台叫做CORE的远端的机器:

 

robocopy "C:\Temp\Coresight2016" "\\CORES\c$\Coresight2016" /e

 

 

 

使用命令行, 在Server 核心版机器上运行在 installsrc Setup.exe 并按照向导提示安装。PI System Explorer 可以选择不安装,因为它不是必须的,但是他会使得天机PI和AF Server更加容易。不管怎样,PI Coresight到这时已经被安装了。

 

 

3. 用 shutdown /r /t 0 命令重启电脑

 

4. 配置PI Coresight Application Pools让他用一个 service 账户运行

 

如果按照之前的post(Coresight 系列讨论 - 在Windows Server核心版安装和配置远程管理步骤已经完成,配置AppPool会变得容易很多,因为可以通过IIS manager远程操控

 

或者,使用 Powershell. 例如,配置 Coresight AppPools 用 OSI\CoresightSVC:

Import-Module WebAdministration;  
Set-ItemProperty iis:\apppools\coresightserviceapppool -name processModel -value @{userName="OSI\CoresightSVC";password="password";identitytype=3}  
Set-ItemProperty iis:\apppools\coresightadminapppool -name processModel -value @{userName="OSI\CoresightSVC";password="password";identitytype=3} 

 

5. 回收两个Coresight AppPools – 在命令行中运行 iisreset 或者在通过IIS Manager在远端回收AppPool

 

PI Coresight - 安装后工作

 

1. 给PI Coresight 和/或 PI Coresight 管理页面添加权限

 

PI Coresight 应用 - 本地 Windows 用户组 PI Coresight Users 在 PI Coresight 服务器上控制PI Coresight应用的权限。默认情况下经过验证用户组(Authenticated Users group)是其中一个成员。

PI Coresight 管理 - 本地 Windows 用户组 PI Coresight Admins 在 PI Coresight 服务器上控制 PI Coresight 管理的全向。另外一个 PI Coresight 管理员需要是另外一个本地用户组 PI Web API Admins 的成员,以便能允许或者禁用PI Coresight 的PI和AF的来源。默认只用安装Coresight的用户是被加入到这个组当中的.

 

本地用户和组可以从一个工作站上的服务器管理(Server manager)上访问。

 

或者,Poweshell可以被用来添加用户或组到本地用户组当中。比如在CORESIGHTSERVER机器上添加用户 IT.local\AverageJoePI Coresight Admins 本地用户组 ,运行:

$Computer = "CORESIGHTSERVER"  
$Group = "PI Coresight Admins"  
$Domain = "IT.local"  
$UserOrGroup = "AverageJoe"  
([ADSI]"WinNT://$computer/$Group,group").psbase.Invoke("Add",([ADSI]"WinNT://$domain/$userorgroup").path)  

 

Coresight可以配置用任何域或者本地组来运行,具体信息可以参考这篇文档

 

2. 手动创建PI Coresight SQL数据库

 

%pihome64%\Coresight\Admin\SQL 文件夹中所有文件拷贝到一台 SQL Server机器上。

 

使用 robocopy (或者 Windows Explorer复制粘贴功能):

robocopy "C:\Program Files\PIPC\Coresight\Admin\SQL" "\\SQLSERVER\c$\Coresight-SQL" /e  

 

到 SQL Server上,打开一个命令行,导航到含有Coresight SQL文件的文件夹并执行:

GO.BAT DBSERVER DBNAME CoresightAppPoolAccount output.log 

 

比如,在SQL Server MYSQLSERVER上创建一个SQL数据库PICoresight 假设 OSI\CoresightSVC 是运行Coresight AppPools的域账户:

GO.BAT MYSQLSERVER PICoresight OSI\CoresightSVC output.log 

 

对于额外的细节,请参考我们网上的文档

 

最后,连接Coresight应用到Coresight SQL数据库。在网页服务器上,导航到Coresight Admin page > Configuration > PI Coresight Database 并选择合适的SQL Server和SQL数据库

 

注意:因为这个已知的问题, 管理页面会显示Coresight SQL database的连接不健康。要证明这个状况是不是假阳性,到Coresight主页上,创建一个页面并保存,如果这些操作都成功,说明Coresight和SQL Database的连接是没有问题的。

 

3. 在PI Coresight管理页面配置允许的PI和AF数据源

 

额外的PI服务器和AF服务器需要被添加到已知服务器列表(KST)中才能被Coresight使用

 

选项 1) 使用 PI System Explorer (PSE)

 

如果 PSE 在安装AF Client时已经被安装了,可以用它来添加新的PI或者AF服务器。在Server核心版的机器上,使用命令行导航到 %pihome64%\AF (cd /d %pihome64%\AF) 路径下,接着运行AFExplorer.exe.

PSE将会正常打开,在 File > Connections 菜单中可以完成此项工作

 

Option 2) PSE 不可用 - 手动添加PI /AF服务器

 

AF 服务器的信息存储在 AFSDK.config 文件中 (位于 %programdata%\OSIsoft\AF). 在命令行中导航到相应路径,并打开它

cd /d  %programdata%\OSIsoft\AF  
notepad  AFSDK.config  

 

添加一个新的 AF 服务器到 PISystems 集合中:<PISystem name="AFSERVERNAME" host="AFSERVERHOST" protocol="Tcp" port="5457" accountName="" timeout="300" />. Server的唯一 ID 将会在第一次连接时自动生成

 

比如: <PISystem name="CSAFBUILD" host="CSAFBUILD" protocol="Tcp" port="5457" accountName="" timeout="300" /> 将会变成 <PISystem name="CSAFBUILD" id="638f25d4-21ed-44ea-92bb-84305d373578" host="CSAFBUILD" protocol="Tcp" port="5457" accountName="" timeout="300" /> 在第一次连接后

 

 

PI 服务器信息存储在注册表 HKLM\SOFTWARE\PISystem\PI-SDK\1.0\ServerHandles 位置

用Powershell添加新的PI Data Archive - 如果有需要,设置$PI 变量的值。

$PI = "PISERVERNAME"  
$Key = "HKLM:\SOFTWARE\PISystem\PI-SDK\1.0\ServerHandles\" + $PI  
If ( -Not ( Test-Path $Key)){New-Item -Path $Key -ItemType RegistryKey -Force}  
Set-ItemProperty -path $Key -Name "configString" -Type "String" -Value ""  
Set-ItemProperty -path $Key -Name "confirmed" -Type "String" -Value "0"  
Set-ItemProperty -path $Key -Name "defaultServer" -Type "String" -Value "0"  
Set-ItemProperty -path $Key -Name "defaultUser" -Type "String" -Value "pidemo"  
Set-ItemProperty -path $Key -Name "path" -Type "String" -Value $PI  
Set-ItemProperty -path $Key -Name "port" -Type "String" -Value "5450"  
Set-ItemProperty -path $Key -Name "serverID" -Type "String" -Value ""  

 

或者直接在注册表中创建相应的条目

在任何情况下,第一次连接PI Data Archive后ServerID属性会被自动添加。

 

到此为止,PI Coresight + Server 核心版的配置已经全部完成,下一章将介绍 Kerberos配置

这边文档翻译自pisquare相同名字的博客,想要看到更多信息可以参考pisquare上的相关内容。Coresight Squared

这个系列目前包括以下三个内容:

  1. windows Server核心版安装和配置<<您现在在这里
  2. PI Coresight安装
  3. Kerberos配置

 

Server核心版 - 安装和配置

 

Server核心版是安装Windows Server2012 R2时的默认设置:

 

第一次登陆您的Server Core机器 - 在欢迎界面只有一个命令行!

用服务器配置工具 (sconfig) 来重命名机器, 配置 DNS 设置, 加入一个Windows 域, 启用 Windows 更新, 启用Remote Management远程管理等等.

要使用这个工具, 在命令行中执行sconfig。使用sconfig很容易, 不过我建议按照如下方式进行:

 

1. 配置DNS设置

选择 Option 8 > select index of the Ethernet card(选择网卡的id) > 选择 Option 2 (Set DNS Servers)(选择DNS Server) > set preferred (and alternate) DNS server(s) (选择备用DNS Server)

2. 将电脑添加到Windows域当中

选择Option 1 > 选择 D 作为域 > 输入域名 > 确认并完成

3. 重命名电脑 - 这个选项在电脑加入Windows 域之后会自动弹出.

4. 重启 - 在sconfig中使用Option 13.

 

5. 启用Windows更新

选择 Option 5 > 选择 A 作为自动

6. 配置入站防火墙设置

使用Powershell, 启用文件和防火墙共享 进站规则以便将PI Coresight安装文件拷贝到这台机器上。这个规则在安装完Coresight之后可以被禁用

 

Enable-NetFirewallRule -DisplayGroup "File And Printer Sharing"  

 

为了更好的远程管理,启用如下防火墙规则

Enable-NetFirewallRule -DisplayGroup "Remote Event Log Management"  
Enable-NetFirewallRule -DisplayGroup "Remote Service Management"  
Enable-NetFirewallRule -DisplayGroup "Remote Volume Management"  

7. 激活所有PI Coresight需要的角色和功能

 

使用 CSRolesFeatures.ps1 (这个post的附件或者可以在 pastebin找到) 可以迅速完成这项工作。使用robocopy将此文件拷贝到核心版Server的机器上(命令行中有此工具)或者使用Windows Explorer的复制和粘贴功能。

 

比如,从本地D:\Downloads文件夹下将 CSRolesFeatures.ps1 拷贝到CORESQUAREDC:\Temp 使用 robocopy:

 

robocopy "D:\Downloads" "\\CORESQUARED\C$\Temp" CSRolesFeatures.ps1

 

 

在核心版服务器上打开PowerShell对话框 (在命令行中执行 powershell 命令) 并允许在当前session执行脚本,并运行此脚本。

Set-Executionpolicy RemoteSigned -Scope Process  
.\CSRolesFeatures.ps1 -Mode Install -IsCore $true  

 

当此脚本运行完成后,在命令行中用shutdown /r /t 0命令重启机器

 

Server 核心版 – 启用远程管理

 

使用sconfig > 选择 Option 4 > 选择 option 1 来启用远程管理。

 

使用远程管理来添加/删除Windows功能, 维护本地用户和组,查看事件日志等

 

remote IIS Management需要Web Server Management Service。用 PowerShell来 安装此服务并且设置相关的注册表配置:

Install-WindowsFeature Web-Mgmt-Service  
Set-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\WebManagement\Server -Name EnableRemoteManagement -Value 1  

最后用 net start WMSVC启动Web Management service。您也可以将这个服务设为自动:sc config wmsvc start=auto

 

现在Server核心版可以完全被远程的workstation管理了(Server Manager 用于常用的管理, IIS Manager 用于IIS的管理)!

 

要远程连接Server核心版的IIS,在远程任意一台机器上打开IIS Manager,右键选择 Start Page 并选择 Connect to a Server... 选项:

PI Coresight 2016相比于之前版本有非常大的变化,其中一项重要的改进是允许用户自己添加自定义的图案。pisquare中已经有非常多相关的post,如添加谷歌地图,添加RSS种子添加时间轴等等,并且不断有新的post更新。相关的配置文档可以在此处找到,此外在github上有关于custom symbol比较详细的介绍,下面结合其中一个案例(单个值的图形),简单介绍一下创建custom symbol的基本方法,和一些配置参数。

在PI Coresight的安装文件夹下INSTALLATION_FOLDER\Scripts\app\editor\symbols\ext创建名为sym-simplevalue.js的文件。如果ext文件夹不存在,您需要手动创建此文件夹。

将如下代码添加到刚创建的js文件中,这会初始化用于创建custom symbol的结构。这个代码创建了一个IIFE(immediately invoked functional expression,立即执行函数),此函数将会取到将会被用来注册symbol的PI Coresight对象

(function (CS) {
})(window.Coresight);

创建一个定义对象,并注册。这里symbol catalog是一个我们用来注册和管理所有Coresight symbols。我们这样会创建一个空的对象,并将其传递到注册函数中。因为这是一个立即执行函数,一旦浏览器执行它,它将会运行这个注册的代码

(function (CS) {
    var definition = {};
    CS.symbolCatalog.register(definition);
})(window.Coresight);

接下来我们,开始添加一个新的图案中必须的部分:

typeName是PI Coresight注册时使用的一个内部名字。这个名字在所有Coresight的图案中必须是唯一的。

datasourceBehavior用来指定有多少搜索结果(None用来表示静态值,Single表示单个值,Multiple表示多个值。此处我们使用单个值,如果需要画自定义的trend,那就需要多个值,即multiple)可以被用来创建这个图案。

(function (CS) {
    var definition = {
        typeName: 'simplevalue',
        datasourceBehavior: CS.DatasourceBehaviors.Single
    };
    CS.symbolCatalog.register(definition);
})(window.Coresight);

接下来,我们将添加一些具体使用的信息:这里我们会添加getDefaultConfig属性。这个函数是用来指定一系列symbol形态的参数的。如这里我们指定datashape为Value,那我们会显示一个value的图案

(function (CS) {
   var definition = {
  typeName: 'simplevalue',
  datasourceBehavior: CS.DatasourceBehaviors.Single,
   getDefaultConfig: function() {
   return {
  DataShape: 'Value'
  };
  }
  };
   CS.symbolCatalog.register(definition);
})(window.Coresight);

在继续完善之前的代码之前,我们现在与之前js文件相同的文件夹下创建一个名为sym-simplevalue-template.html的函数,这里命名的规则是:sym-<图案类型名>-template.html。这是一个symbol框架会默认去寻找的名字,如果template路径没有在symbol中被指定的话(可以通过templateUrl来指定)。加入以下内容到HTML文件。这里现在只是一个占位符。

<div style="background: red">
    <div>Simple Value</div>
</div>

这里,为了让这个心得图案被PI Coresight 网页服务器接收到,需要运行IIS reset

接下来,打开Coresight的页面,搜索一个PI点或者AF属性,将该属性拖动到画布中。您会发现当您放下这个item之后,您还无法选择它。这是因为这个图案没有包括一个init函数。

为了修复这个问题,我们需要更新getDefaultConfig函数,让它返回高(Height)和宽(Width)。此外我们需要添加初始化(initialization)函数到definition对象中。init函数是在图案被添加到画布的时候被调用的。

(function (CS) {
    var definition = {
        typeName: 'simplevalue',
        datasourceBehavior: CS.DatasourceBehaviors.Single,
        getDefaultConfig: function() {
            return {
                DataShape: 'Value',
                Height: 150,
                Width: 150
            };
        },
        init: init
    };


    function init() {
    }


    CS.symbolCatalog.register(definition);
})(window.Coresight);

再在Coresight中添加新的图案。图案现在可以被选择、移动,并且可以使用Coresight中的撤销功能了。这样基础架构已经搭好了,为了给图案添加新的功能,我们需要扩展init函数。我们会添加一个新的参数到这个函数中scope。Scope是一个从AngularJS中借用的,是一个让页面和后台JS更方便互动的框架。init函数会有一个函数来处理当图案获得一个新的数据时。最终我们会添加一个返回函数到init函数中,让PI Coresight知道如何和图案交互。

function init(scope) {
    function onUpdate(data) {
    }
    return { dataUpdate: onUpdate };
}

上面这段代码告诉PI Coresight每当数据更新时去调用onUpdate函数。现在我们需要对onUpdate函数做一些扩展

用下面这段函数来添加一些变量到scope中:value,timelabel。这样可以让这些变量在HTML展示画面中使用。为了完整性,我们会检查data和Label这两个变量在被onUpdate函数使用时是否已经被定义了。

function init(scope) {
    function onUpdate(data) {
        if(data) {
            scope.value = data.Value;
            scope.time = data.Time;
            if(data.Label) {
                scope.label = data.Label;
            }
        }
    }
    return { dataUpdate: onUpdate };
}

现在我们可以更新HTML文件来显示这些值了。我们使用AngularJS的样式来标记{{}}。此外我们还在div中添加了一些背景颜色的style。

<div style="background: orange; color: black">
    <div>{{label}}</div>
    <div>{{value}}</div>
    <div>{{time}}</div>
</div>

重新尝试在Coresight中添加这个新的图案。

接下来我们介绍如何修改这个图案的颜色。首先我们需要添加一个内容菜单的选项到图案中,这是通过添加configOptions属性来实现的。configOptions是一个图案可用属性的一个函数,它会返回一个控制配置的数组。在这个案例中,我们返回了名为‘Format Symbol’的对象。在这里使用的‘mode’是用来指定配置类型的。这样当我们右键点击图案,选择配置图案时,我们将会打开右侧PI Coresight 配置画面。

var definition = {
    typeName: 'simplevalue',
    datasourceBehavior: CS.DatasourceBehaviors.Single,
    getDefaultConfig: function() {
        return {
            DataShape: 'Value',
            Height: 150,
            Width: 150
        };
    },
    configOptions: function () {
        return [{
            title: 'Format Symbol',
            mode: 'format'
        }];
    },
    init: init
};

接下来我们需要创建一个configurationHTML的画面。在相同文件夹下创建sym-simplevalue-config.html文件。命名规则是sym-<图案名>-config.html。同理,如果不按照这个规则命名,需要在configTemplateUrl参数中指定。下面这个例子中包含了两种配置:文字颜色和背景颜色。我们这里使用了format-color-picker,这是一个AngularJS的服务让Coresight可以给图案挑选颜色。format-color-picker有两个属性:property和config。property对应config对象中传递进来的属性,config是图案中的config对象。

<div class="c-side-pane t-toolbar">
    <span style="color:#fff; margin-left:15px">Text Color</span>
</div>
<format-color-picker id="textColor" property="TextColor" config="config"></format-color-picker>
<div class="c-side-pane t-toolbar">
    <span style="color:#fff; margin-left:15px">Background Color</span>
</div>
<format-color-picker id="backgroundColor" property="BackgroundColor" config="config"></format-color-picker>

我们也需要对原来的展示页面做一些修改,使得我们配置页面的属性也可以关联进来。这里我们需要用到一个AngularJS的辅助工具,ng-style

<div ng-style="{background: config.BackgroundColor, color: config.TextColor}">
    <div>{{label}}</div>
    <div>{{value}}</div>
    <div>{{time}}</div>
</div>

最后,我们还可以配置我们的图案,使之可以显示或隐藏一部分属性。要做到这点,我们需要更新getDefaultConfig函数,使之包含可以显示或者隐藏标题和时间的boolean形变。如下面的代码所示,默认我们是会显示标题,但不显示时间戳

getDefaultConfig: function() {
    return {
        DataShape: 'Value',
        Height: 150,
        Width: 150,
        BackgroundColor: 'rgb(255,0,0)',
        TextColor: 'rgb(0,255,0)',
        ShowLabel: true,
        ShowTime: false
    };
},

同时,展示的html画面也需要做一些修改,我们通过ng-show的辅助工具(同样也是angularJS的功能)可以控制是否显示相应的属性。当绑定的值为true是,将会显示这个元素,反之则隐藏这个元素。

<div ng-style="{background: config.BackgroundColor, color: config.TextColor}">
    <div ng-show="config.ShowLabel">{{label}}</div>
    <div>{{value}}</div>
    <div ng-show="config.ShowTime">{{time}}</div>
</div>

最后,我们对配置页面也需要做一些修改,使之可以选择是否显示时间或者标题。

<div class="c-side-pane t-toolbar">
    <span style="color:#fff; margin-left:15px">Text Color</span>
</div>
<format-color-picker id="textColor" property="TextColor" config="config"></format-color-picker>
<div class="c-side-pane t-toolbar">
    <span style="color:#fff; margin-left:15px">Background Color</span>
</div>
<format-color-picker id="backgroundColor" property="BackgroundColor" config="config"></format-color-picker>


<div class="c-side-pane t-toolbar">
    <span style="color:#fff; margin-left:15px">Show Options</span>
</div>
<div class="c-config-content">Show Label:
    <input type="checkbox" ng-model="config.ShowLabel">
</div>
<div class="c-config-content">Show Time:
    <input type="checkbox" ng-model="config.ShowTime">
</div>

这样基本的功能就完成了,下面我们修改一下配置信息使之可以显示multistate。要做到这一点,我们必须添加StateVariables到图案的definition对象。

var definition = {
    typeName: 'simplevalue',
    datasourceBehavior: CS.DatasourceBehaviors.Single,
    getDefaultConfig: function() {
        return {
            DataShape: 'Value',
            Height: 150,
            Width: 150,
            BackgroundColor: 'rgb(255,0,0)',
            TextColor: 'rgb(0,255,0)'
        };
    },
    StateVariables: [ 'MultistateColor' ],
    configOptions: function () {
        return [{
            title: 'Format Symbol',
            mode: 'format'
        }];
    },
    init: init
};

此外还需要对展示页面做一些修改,使得页面颜色可以使用multistate中定义的颜色。这里,如果multistate被定义了,那颜色就会用multistate的定义,如果没有定义,就用默认的颜色。

<div ng-style="{background: config.BackgroundColor, color: MultistateColor || config.TextColor}">
    <div ng-show="config.ShowLabel">{{label}}</div>
    <div>{{value}}</div>
    <div ng-show="config.ShowTime">{{time}}</div>
</div>

原文post在此链接How to customize the appearance of PI Coresight 2016  ,作者为KenjiJerome。以下为原文链接的翻译:

 

改变Coresight页面Tab的外观,如下

to

您能将“PI Coresight”的title改为任意内容,如此处所示,内容已被改为Kenji Coresight,有三处地方可以做这些修改

 

1. For the Homepage:

%PIHOME64%\Coresight\Views\Home\Index.cshtml

ViewBag.Title = "PI Coresight";

 

2. For a ProcessBook Page:%PIHOME64%\Coresight\Scripts\app\pbviewer\pbviewer.navigation.js

function setTitle(displayName) {
     var title = 'PI Coresight';

 

3 PI Coresight Display:%PIHOME64%\Coresight\Scripts\app\editor\display\coresight.display-controller.js

 function setTitle(displayName) {  
            var title = 'PI Coresight'; 

 

如果想改变移动端的展示,可以修改如下内容: %PIHOME64%\Coresight\Views\M\Index.cshtml

<title>PI Coresight</title>  
<div data-role="page" data-title="PI  Coresight" id="mostrecent" class="appBackground">  
<div data-role="page" data-title="PI Coresight" id="search" class="appBackground">  
<div data-role="page" data-title="PI Coresight" id="csdisplay" class="appBackground" data-add-back-btn="true">  
<div data-role="page" data-title="PI Coresight" id="pbdisplay" class="appBackground" data-add-back-btn="true">  
<div data-role="page" data-title="PI Coresight" id="element" class="appBackground unselectable" data-add-back-btn="true">  
<div data-role="page" data-title="PI Coresight" id="trend" class="appBackground unselectable" data-add-back-btn="true">  
<div data-role="page" data-title="PI Coresight" id="servicesandtools"> 

 

您也能改变site的网站图标,只要改变%PIHOME64%\Coresight\Images\logo.png文件即可

to

 

如果您想改变Help的内容,您可以在%PIHOME64%\Coresight\Scripts\app\editor\layout\coresight.cs-header-directive.js中修改,例如如果您将以下内容注释了,将会在Help中删除PI Live Library

  1. { id: 'HelpMenuOnLine', title: CS.Messages.HelpMenuOnLine, url: 'https://livelibrary.osisoft.com/LiveLibrary/content/' + lang + '/coresight-v7/GUID-7EF650C5-1235-4F8A-AC61-2EB1D2A3A5BF ' }, 

to

 

如果您不想让用户创建新的display

删除 在 %PIHOME64%\Coresight\Scripts\app\editor\layout\coresight.cs-header-directive.js中的div class="c-new-display"

You can delete all of the followings.

<div class="c-new-display t-display-content-font">  
            <div class="c-icon-display" ng-click="navCtrl.newDisplay()" title="{{::newDisplayTooltip}}">  
                <div class="c-new-display-rollover">  
                    <div>  
                        <svg id="new-display-icon" class="t-icon-fill" version="1.1" x="0px" y="0px"  
                             width="25px" height="25px" viewBox="0 -4 25 25" enable-background="new 0 0 25 25" xml:space="preserve">  
                        <path d="M9.677,0.823c-5.12,0-9.271,4.188-9.271,9.354c0,5.169,4.151,9.356,9.271,9.356  
                                    c5.119,0,9.271-4.188,9.271-9.356C18.948,5.012,14.796,0.823,9.677,0.823" />  
                        <polygon fill="#091d3a" points="15.553,8.831 10.982,8.831 10.982,4.114 8.37,4.114 8.37,8.831 3.8,8.831 3.8,11.527 8.37,11.527  
                                    8.37,16.243 10.982,16.243 10.982,11.527 15.553,11.527" />  
                        </svg>  
                    </div>  
                    <div class="t-font-color-white" style="text-decoration: none">{{::newDisplayLinkText}}</div>  
                </div>  
            </div>  
        </div>

 

这样所有用户都不能再创建新display了

但是您仍然可以手动通过如下url来创建新的display

https://ServerName/coresight/#/Displays/New/

 

如果您想保持所有display都是显示kiosk mode,您可以注释以下语句

%PIHOME64%\Coresight\Scripts\app\editor\display\coresight.displays-controller.js

 

// if (parms.mode === 'kiosk')  
setKioskMode(true);  

If you do this, all users/ all displays can be seen as Kiosk mode.We could not choose which users can see display without kiosk. So if you want to create/edit display, you need to change comments out again. (Found with Jerome Lefebvre)

 

PI Coresight 2016 Value object 会显示工具提示. 如果您不想显示

%PIHOME64%\Coresight\Scripts\app\editor\symbols\coresight.sym-value.js

//valueLabel.path = data.Path;  

 

如果您这样做,您将不会看到工具提示

在默认情况下,多状态(multi-state)将会改变背景颜色By default, Value object's Multi-State changes background color.

如果您想改变字体本身大小,需要修改 sym-value-template.html的"Fill ||”

%PIHOME64%\Coresight\Scripts\app\editor\symbols\sym-value-template.html

     
               
     
                         
     
               
 
 

这样您将可以改变文字颜色而不是背景色

 

为了改变画面的背景色,您可以修改t-display-container类

%PIHOME64%\Coresight\Content\css\theme.base-colors.css

contains the t-display-container.

.t-display-container {  
  background-color: white; } 

 

这样就显示白色的背景色了

PI Coresight 2016 可以使用自定义的图案,具体可以参考如下repository

GitHub - osisoft/PI-Coresight-Custom-Symbols: Learn how to add a custom symbol, created with JavaScript and HTML, to PI …

如果您不自己设置,默认您定义的custom symbol将会显示 图案.

您可以找自己想要的图案(png/jpg格式),或者直接截屏(注意将display背景色改为#48586b

将图案放置到 %PIHOME64%\Coresight\Images 文件夹下

在custom symbol的配置js文件中指定iconURL参数

 

var defintion = {  
typeName: 'liquidgauge',  
iconUrl: 'Images/liquid.png',  

效果如下图所示.

如果您点击这个item,您会发现这个图片是包含背景颜色的。当然您最好可以创建一个没有背景色的图案,但能用系统自带的画图工具来获得image总是比较简单的方法

第三方软件也是个不错的方案,例如

https://inkscape.org/en/

 

我还没有检查所有的item,但是看上去HTML5在修改了很多内容之后,仍然可以正常工作。当然这些并不是我们OSI官方的修改