--- /dev/null
+package Perl2Epics;
+use warnings;
+use strict;
+use Data::Dumper;
+# use Hmon;
+
+use lib '/home/scs/EPICS/gcc-4.4/EPICS-3.14.12.2_linux-x86_64/base/' . '/lib/perl';
+use CA;
+
+$ENV{EPICS_CA_AUTO_ADDR_LIST} = 'YES';
+$ENV{EPICS_CA_ADDR_LIST} = "192.168.100.11 192.168.100.12 192.168.100.13 192.168.100.14 192.168.100.15 localhost";
+
+
+my $EpicsValues = {};
+my $EpicsStore = {};
+my @EpicsChans = ();
+my $EpicsNames = {};
+my $errcnt = {};
+
+sub callback {
+ my ($chan, $status, $data) = @_;
+ #print Dumper $data;
+ if ($status) {
+ printf "%-30s %s\n", $chan->name, $status;
+ }
+ else {
+# print $chan->name . ": $data->{value}\n";
+# print scalar @{$EpicsStore->{$chan->name}->{tme}}."\n";
+ if(scalar @{$EpicsStore->{$chan->name}->{tme}} > 10) {
+ shift @{$EpicsStore->{$chan->name}->{tme}};
+ shift @{$EpicsStore->{$chan->name}->{val}};
+ }
+ push(@{$EpicsStore->{$chan->name}->{tme}}, $data->{stamp});
+ push(@{$EpicsStore->{$chan->name}->{val}}, $data->{value});
+ $EpicsValues->{$chan->name}->{tme} = $data->{stamp};
+ $EpicsValues->{$chan->name}->{val} = $data->{value};
+ }
+}
+
+
+sub Connect {
+ my ($title, $varname, $type, $wait) = @_;
+ # push(@EpicsChans,CA->new($name));
+ # $EpicsChans[-1]->create_subscription('v', \&callback, 'DBR_TIME_DOUBLE');
+ ## print $varname."\n";
+ $type = 'DBR_TIME_DOUBLE' unless defined $type;
+ $EpicsStore->{$varname}->{tme} = [];
+ $EpicsStore->{$varname}->{val} = [];
+ $EpicsNames->{$title} = $varname;
+ $errcnt->{$varname} = 0;
+ my $success;
+ eval {
+ my $c = CA->new($varname);
+ CA->pend_io($wait || 0.05);
+ $c->create_subscription('v', \&callback, $type);
+# $c->get_callback(\&callback, $type, 1);
+ $EpicsStore->{$varname}->{ca} = $c;
+ $success = $c->is_connected();
+ };
+ #print Dumper $EpicsValues;
+ return ($success);
+}
+
+sub Update {
+ CA->pend_event($_[0]);
+}
+
+
+sub GetAll {
+ my $store = {};
+ my $time;
+ my $val;
+
+ Update(0.001);
+
+ foreach my $el (keys %{$EpicsNames}) {
+ my $varname = $EpicsNames->{$el};
+ my $ca = $EpicsStore->{$varname}->{ca};
+ my $r = $ca->is_connected() if(defined $ca);
+ my $success = 1;
+ if(!$r && (!defined $errcnt->{$el} || $errcnt->{$el} < 20)) {
+ $success = Connect($el, $varname);
+ $errcnt->{$el}++;
+ }
+
+ if(!$success) {
+ $time = -1;
+ $val = 0;
+ } elsif (scalar @{$EpicsStore->{$varname}->{tme}} > 0) {
+ $time = (@{$EpicsStore->{$varname}->{tme}})[-1];
+ $val = (@{$EpicsStore->{$varname}->{val}})[-1];
+ } else {
+ $time = $EpicsStore->{$varname}->{lasttime};
+ $val = $EpicsStore->{$varname}->{lastval};
+ }
+ $store->{$el}->{tme} = $time;
+ $store->{$el}->{val} = $val;
+ $EpicsStore->{$varname}->{lasttime} = $time;
+ $EpicsStore->{$varname}->{lastval} = $val;
+ }
+
+ return $store;
+}
+
+sub Get {
+ my ($title,$latest) = @_;
+ my $varname = $EpicsNames->{$title};
+ my $time;
+ my $val;
+# print $varname;
+
+ my $c = $EpicsStore->{$varname}->{ca};
+ my $r = $c->is_connected() if(defined $c);
+
+ my $success = 1;
+ if(!$r) {
+ $success = Connect($title, $varname);
+ }
+
+ if(!$success) {
+ return (-1, 0);
+ }
+
+ Update(0.00001);
+
+ if (scalar @{$EpicsStore->{$varname}->{tme}} > 0) {
+ if(defined $latest && $latest == 1) {
+ $time = (@{$EpicsStore->{$varname}->{tme}})[-1];
+ $val = (@{$EpicsStore->{$varname}->{val}})[-1];
+ }
+ else { #if (scalar @{$EpicsStore->{$varname}->{tme}} > 1)
+ $time = shift (@{$EpicsStore->{$varname}->{tme}});
+ $val = shift (@{$EpicsStore->{$varname}->{val}});
+ }
+ }
+ else {
+ $time = $EpicsStore->{$varname}->{lasttime};
+ $val = $EpicsStore->{$varname}->{lastval};
+ }
+ $EpicsStore->{$varname}->{lasttime} = $time;
+ $EpicsStore->{$varname}->{lastval} = $val;
+ $time = $time || -1;
+ $val = $val || 0;
+ return ($time,$val);
+}
+
+sub Put {
+ my ($title, $value) = @_;
+ my $varname = $EpicsNames->{$title};
+ if (!defined $varname) {
+ return -1;
+ }
+
+ my $c = $EpicsStore->{$varname}->{ca};
+ my $r = $c->is_connected() if(defined $c);
+
+ my $success = 1;
+ if(!$r) {
+ $success = Connect($title, $varname);
+ }
+
+ if(!$success) {
+ return -2;
+ }
+
+ if (($c->element_count()) != 1) {
+ print "5\n";
+ return -3;
+ }
+
+ my $type = $c->field_type;
+ my @values;
+ if ($type !~ m/ ^DBR_STRING$ | ^DBR_ENUM$ /x) {
+ # Make @ARGV strings numeric
+ push (@values, (map { +$_; } $value));
+ } else {
+ # Use strings
+ push (@values, $value);
+ }
+ $c->put(@values);
+
+ return 0;
+}
+
+1;
+__END__
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+<title> Apr7 < RICH < Hades Wiki</title>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+<meta name="google-site-verification" content="dbjLrVX1_-lOC8CzUtYiv_Nu0ZDCkceGTM2DjWqtM2A" />
+
+<link rel="alternate" type="application/rss+xml" title="RSS Feed" href="http://hades-wiki.gsi.de/cgi-bin/view/RICH/WebRss?skin=rss&contenttype=text/xml" />
+<base href="http://hades-wiki.gsi.de/cgi-bin/view/RICH/Apr7" />
+<style type="text/css" media="all">
+ /* Default TWiki layout */
+ @import url("http://hades-wiki.gsi.de/pub/TWiki/PatternSkin/layout.css");
+ /* Default TWiki style */
+ @import url("http://hades-wiki.gsi.de/pub/TWiki/PatternSkin/style.css");
+ /* Custom overriding layout per web or per topic */
+ @import url("");
+ /* Custom overriding style per web or per topic */
+ @import url("");
+ @import url("http://hades-wiki.gsi.de/pub/TWiki/JSCalendarContrib/calendar-system.css");
+ .twikiToc li {
+ list-style-image:url(http://hades-wiki.gsi.de/pub/TWiki/PatternSkin/i_arrow_down.gif);
+ }
+ .twikiWebIndicator {
+ background-color:#7FDFFF;
+ }
+</style>
+<style type="text/css" media="all"></style>
+<script type="text/javascript">
+<!-- HIDE
+
+ function initPage() { }
+-->
+</script>
+<script type="text/javascript" src="http://hades-wiki.gsi.de/pub/TWiki/JSCalendarContrib/calendar.js"></script>
+<!-- Language to use in calendars. The following languages are usually available from the JSCalendarContrib module: af br ca cs da de du el en es fi fr hr hr hu it jp ko ko lt lt nl no pl pl-utf8 pt ro ru si sk sp sv tr zh -->
+<script type="text/javascript" src="http://hades-wiki.gsi.de/pub/TWiki/JSCalendarContrib/lang/calendar-de.js"></script>
+
+</head>
+<body class="twikiViewPage" onload="initPage()"><a name="PageTop"></a>
+<div class="twikiHidden"><a href="?CGISESSID=001ebab3a3dda66197b9b2232214db2b&CGISESSID=001ebab3a3dda66197b9b2232214db2b#Content">Skip to topic</a> | <a href="?CGISESSID=001ebab3a3dda66197b9b2232214db2b&CGISESSID=001ebab3a3dda66197b9b2232214db2b#PageBottom">Skip to bottom</a><hr /></div><div class="twikiTopBar"><div class="twikiTopBarContents"><form name="top" action="/cgi-bin/view/RICH/Apr7">
+<input type="hidden" name="CGISESSID" value="001ebab3a3dda66197b9b2232214db2b" />
+<input type="hidden" name="CGISESSID" value="001ebab3a3dda66197b9b2232214db2b" /> <div class="twikiLeft">
+<a href="http://www-hades.gsi.de" rel="nofollow"><img src="http://hades-wiki.gsi.de/pub/Collaboration/HadesLogos/hades_wiki_logo_pattern_skin.gif" border="0" alt="Home"/></a>
+</div>
+<div class="twikiRight twikiSearchBox">
+<table border="0" cellpadding="0" cellspacing="0">
+<tr>
+<td><label for="go">Jump: </label><input type="text" id="go" name="topic" size="16" /></td>
+</tr>
+</table>
+</div>
+</form></div></div><div class="twikiMiddleContainer"><div class="twikiLeftBar"><div class="twikiWebIndicator"><b>RICH</b></div>
+<div class="twikiLeftBarContents"><form name="main" action="/cgi-bin/view/RICH/Apr7">
+<input type="hidden" name="CGISESSID" value="001ebab3a3dda66197b9b2232214db2b" />
+<input type="hidden" name="CGISESSID" value="001ebab3a3dda66197b9b2232214db2b" />
+<div class="twikiLeftBarPersonal" style="margin-top:0;">
+Hello <a class="twikiLink" href="/cgi-bin/view/Main/LudwigMaier?CGISESSID=001ebab3a3dda66197b9b2232214db2b&CGISESSID=001ebab3a3dda66197b9b2232214db2b">LudwigMaier</a> !
+<div id="twikiLeftBarPersonalContent">
+<a href="/cgi-bin/edit/Homepages/LeftBarLudwigMaier?templatetopic=TWiki.WebLeftBarPersonalTemplate&topicparent=Main.LudwigMaier&CGISESSID=001ebab3a3dda66197b9b2232214db2b&CGISESSID=001ebab3a3dda66197b9b2232214db2b">Create</a> personal sidebar
+</div>
+</div>
+<br />
+<p />
+<strong>RICH Web</strong> <br />
+<a class="twikiLink" href="/cgi-bin/view/RICH/WebHome?CGISESSID=001ebab3a3dda66197b9b2232214db2b&CGISESSID=001ebab3a3dda66197b9b2232214db2b">Web Home</a> <span class="twikiSeparator">|</span> <a class="twikiLink" href="/cgi-bin/view/RICH/WebSearch?CGISESSID=001ebab3a3dda66197b9b2232214db2b&CGISESSID=001ebab3a3dda66197b9b2232214db2b">Search</a> <br />
+<a class="twikiLink" href="/cgi-bin/view/RICH/WebTopicList?CGISESSID=001ebab3a3dda66197b9b2232214db2b&CGISESSID=001ebab3a3dda66197b9b2232214db2b">Topics List</a> <span class="twikiSeparator">|</span> <a class="twikiLink" href="/cgi-bin/view/RICH/WebIndex?CGISESSID=001ebab3a3dda66197b9b2232214db2b&CGISESSID=001ebab3a3dda66197b9b2232214db2b">Index</a> <br />
+<a class="twikiLink" href="/cgi-bin/view/RICH/WebChanges?CGISESSID=001ebab3a3dda66197b9b2232214db2b&CGISESSID=001ebab3a3dda66197b9b2232214db2b">Changes</a> <span class="twikiSeparator">|</span> <a class="twikiLink" href="/cgi-bin/view/RICH/WebNotify?CGISESSID=001ebab3a3dda66197b9b2232214db2b&CGISESSID=001ebab3a3dda66197b9b2232214db2b">Notifications</a> <br />
+<p />
+<p />
+<hr />
+<p />
+<strong>Hades Wiki Webs</strong>
+<ul>
+<li> <a class="twikiLink" href="/cgi-bin/view/BeamDetectors/WebHome?CGISESSID=001ebab3a3dda66197b9b2232214db2b&CGISESSID=001ebab3a3dda66197b9b2232214db2b">BeamDetectors</a>
+</li>
+<li> <a class="twikiLink" href="/cgi-bin/view/Collaboration/WebHome?CGISESSID=001ebab3a3dda66197b9b2232214db2b&CGISESSID=001ebab3a3dda66197b9b2232214db2b">Collaboration</a>
+</li>
+<li> <a class="twikiLink" href="/cgi-bin/view/Computing/WebHome?CGISESSID=001ebab3a3dda66197b9b2232214db2b&CGISESSID=001ebab3a3dda66197b9b2232214db2b">Computing</a>
+</li>
+<li> <a class="twikiLink" href="/cgi-bin/view/DaqSlowControl/WebHome?CGISESSID=001ebab3a3dda66197b9b2232214db2b&CGISESSID=001ebab3a3dda66197b9b2232214db2b">DaqSlowControl</a>
+</li>
+<li> <a class="twikiLink" href="/cgi-bin/view/Homepages/WebHome?CGISESSID=001ebab3a3dda66197b9b2232214db2b&CGISESSID=001ebab3a3dda66197b9b2232214db2b">Homepages</a>
+</li>
+<li> <a class="twikiLink" href="/cgi-bin/view/KnowledgeBase/WebHome?CGISESSID=001ebab3a3dda66197b9b2232214db2b&CGISESSID=001ebab3a3dda66197b9b2232214db2b">KnowledgeBase</a>
+</li>
+<li> <a class="twikiLink" href="/cgi-bin/view/MDC/WebHome?CGISESSID=001ebab3a3dda66197b9b2232214db2b&CGISESSID=001ebab3a3dda66197b9b2232214db2b">MDC</a>
+</li>
+<li> <a class="twikiLink" href="/cgi-bin/view/Magnet/WebHome?CGISESSID=001ebab3a3dda66197b9b2232214db2b&CGISESSID=001ebab3a3dda66197b9b2232214db2b">Magnet</a>
+</li>
+<li> <a class="twikiLink" href="/cgi-bin/view/Main/WebHome?CGISESSID=001ebab3a3dda66197b9b2232214db2b&CGISESSID=001ebab3a3dda66197b9b2232214db2b">Main</a>
+</li>
+<li> <a class="twikiLink" href="/cgi-bin/view/Meetings/WebHome?CGISESSID=001ebab3a3dda66197b9b2232214db2b&CGISESSID=001ebab3a3dda66197b9b2232214db2b">Meetings</a>
+</li>
+<li> <a class="twikiLink" href="/cgi-bin/view/Physics/WebHome?CGISESSID=001ebab3a3dda66197b9b2232214db2b&CGISESSID=001ebab3a3dda66197b9b2232214db2b">Physics</a>
+</li>
+<li> <a class="twikiLink" href="/cgi-bin/view/Public/WebHome?CGISESSID=001ebab3a3dda66197b9b2232214db2b&CGISESSID=001ebab3a3dda66197b9b2232214db2b">Public</a>
+</li>
+<li> <a class="twikiLink" href="/cgi-bin/view/RICH/WebHome?CGISESSID=001ebab3a3dda66197b9b2232214db2b&CGISESSID=001ebab3a3dda66197b9b2232214db2b">RICH</a>
+</li>
+<li> <a class="twikiLink" href="/cgi-bin/view/RPC/WebHome?CGISESSID=001ebab3a3dda66197b9b2232214db2b&CGISESSID=001ebab3a3dda66197b9b2232214db2b">RPC</a>
+</li>
+<li> <a class="twikiLink" href="/cgi-bin/view/Sandbox/WebHome?CGISESSID=001ebab3a3dda66197b9b2232214db2b&CGISESSID=001ebab3a3dda66197b9b2232214db2b">Sandbox</a>
+</li>
+<li> <a class="twikiLink" href="/cgi-bin/view/Shower/WebHome?CGISESSID=001ebab3a3dda66197b9b2232214db2b&CGISESSID=001ebab3a3dda66197b9b2232214db2b">Shower</a>
+</li>
+<li> <a class="twikiLink" href="/cgi-bin/view/SimAna/WebHome?CGISESSID=001ebab3a3dda66197b9b2232214db2b&CGISESSID=001ebab3a3dda66197b9b2232214db2b">SimAna</a>
+</li>
+<li> <a class="twikiLink" href="/cgi-bin/view/TOF/WebHome?CGISESSID=001ebab3a3dda66197b9b2232214db2b&CGISESSID=001ebab3a3dda66197b9b2232214db2b">TOF</a>
+</li>
+<li> <a class="twikiLink" href="/cgi-bin/view/TWiki/WebHome?CGISESSID=001ebab3a3dda66197b9b2232214db2b&CGISESSID=001ebab3a3dda66197b9b2232214db2b">TWiki</a>
+</li>
+<li> <a class="twikiLink" href="/cgi-bin/view/TechBoard/WebHome?CGISESSID=001ebab3a3dda66197b9b2232214db2b&CGISESSID=001ebab3a3dda66197b9b2232214db2b">TechBoard</a>
+</li>
+<li> <a class="twikiLink" href="/cgi-bin/view/TechnicalIssues/WebHome?CGISESSID=001ebab3a3dda66197b9b2232214db2b&CGISESSID=001ebab3a3dda66197b9b2232214db2b">TechnicalIssues</a>
+</li>
+<li> <a class="twikiLink" href="/cgi-bin/view/Trigger/WebHome?CGISESSID=001ebab3a3dda66197b9b2232214db2b&CGISESSID=001ebab3a3dda66197b9b2232214db2b">Trigger</a>
+</li>
+<li> <a class="twikiLink" href="/cgi-bin/view/Wall/WebHome?CGISESSID=001ebab3a3dda66197b9b2232214db2b&CGISESSID=001ebab3a3dda66197b9b2232214db2b">Wall</a>
+</li>
+</ul>
+<p />
+<hr />
+<p />
+<div class="twikiSmall"><a href="http://hades-wiki.gsi.de/cgi-bin/edit/TWiki/WebLeftBar?CGISESSID=001ebab3a3dda66197b9b2232214db2b&CGISESSID=001ebab3a3dda66197b9b2232214db2b" target="_top">edit WebLeftBar</a></div>
+<p />
+</form></div></div><div class="twikiMain"><div class="twikiToolBar"><div>
+<ul>
+<li> <a href="/cgi-bin/edit/RICH/Apr7?t=1333835507&CGISESSID=001ebab3a3dda66197b9b2232214db2b&CGISESSID=001ebab3a3dda66197b9b2232214db2b"><b>Edit</b></a>
+</li>
+<li> <a href="/cgi-bin/attach/RICH/Apr7?CGISESSID=001ebab3a3dda66197b9b2232214db2b&CGISESSID=001ebab3a3dda66197b9b2232214db2b">Attach</a>
+</li>
+<li> <a href="/cgi-bin/view/RICH/Apr7?skin=print.pattern&CGISESSID=001ebab3a3dda66197b9b2232214db2b&CGISESSID=001ebab3a3dda66197b9b2232214db2b">Printable</a>
+</li>
+</ul>
+</div><div class="twikiRevInfo"><span class="twikiGrayText"><a class="twikiToolbarElem" href="/cgi-bin/view/RICH/Apr7?rev=1.7&CGISESSID=001ebab3a3dda66197b9b2232214db2b&CGISESSID=001ebab3a3dda66197b9b2232214db2b" title="Permanent link to this topic revision">RICH.Apr7</a><span class="twikiToolbarElem">r1.7 - 07 Apr 2012 - 22:43 - <a class="twikiLink" href="/cgi-bin/view/Main/JohannesSiebenson?CGISESSID=001ebab3a3dda66197b9b2232214db2b&CGISESSID=001ebab3a3dda66197b9b2232214db2b">JohannesSiebenson</a></span><span class="twikiToolbarElem"><a href="?CGISESSID=001ebab3a3dda66197b9b2232214db2b&CGISESSID=001ebab3a3dda66197b9b2232214db2b#TopicEnd">topic end</a></span></span></div></div>
+<div class="twikiHidden"><hr /></div><a name="Content"> </a><div class="twikiHidden">Start of topic | <a href="?CGISESSID=001ebab3a3dda66197b9b2232214db2b&CGISESSID=001ebab3a3dda66197b9b2232214db2b#Actions">Skip to actions</a><hr /></div>
+<div class="twikiTopic">
+<h1><a name="7_Apr_Trips"> </a> 7 Apr Trips </h1>
+<p />
+<a name="edittable1"></a>
+<form name="edittable1" action="http://hades-wiki.gsi.de/cgi-bin/viewauth/RICH/Apr7#edittable1" method="post">
+<input type="hidden" name="ettablenr" value="1" />
+<input type="hidden" name="etedit" value="on" />
+<table border="1" cellspacing="1" cellpadding="0">
+<tr><th class="twikiFirstCol" bgcolor="#99CCCC"> <strong>entry #</strong> </th><td bgcolor="#FFFFCC"> day_month_time </td><td bgcolor="#FFFFCC"> S1 </td><td bgcolor="#FFFFCC"> S2 </td><td bgcolor="#FFFFCC"> S3 </td><td bgcolor="#FFFFCC"> S4 </td><td bgcolor="#FFFFCC"> S5 </td><td bgcolor="#FFFFCC"> S6 </td><td bgcolor="#FFFFCC"> Comment </td><td bgcolor="#FFFFCC"> Sign </td></tr>
+<tr><td class="twikiFirstCol" bgcolor="#FFFFFF"> 1 </td><td bgcolor="#FFFFFF"> 07 Apr 00:00 </td><td bgcolor="#FFFFFF"> 2400 V </td><td bgcolor="#FFFFFF"> 2400 V </td><td bgcolor="#FFFFFF"> 2400 V </td><td bgcolor="#FFFFFF"> 2300 V </td><td bgcolor="#FFFFFF"> 2400 V </td><td bgcolor="#FFFFFF"> 2400 V </td><td bgcolor="#FFFFFF"> nom. voltages </td><td bgcolor="#FFFFFF"> JF </td></tr>
+<tr><td class="twikiFirstCol" bgcolor="#FFFFCC"> 2 </td><td bgcolor="#FFFFCC"> 07 Apr 02:42 </td><td bgcolor="#FFFFCC"> 2000 V </td><td bgcolor="#FFFFCC"> 2000 V </td><td bgcolor="#FFFFCC"> 2000 V </td><td bgcolor="#FFFFCC"> 2000 V </td><td bgcolor="#FFFFCC"> 2000 V </td><td bgcolor="#FFFFCC"> 2000 V </td><td bgcolor="#FFFFCC"> safe voltages <br/> no beam till at least 12 pm, <br/> end shift now </td><td bgcolor="#FFFFCC"> LM </td></tr>
+<tr><td class="twikiFirstCol" bgcolor="#FFFFFF"> 3 </td><td bgcolor="#FFFFFF"> 07 Apr 08:58 </td><td bgcolor="#FFFFFF"> 2400 V </td><td bgcolor="#FFFFFF"> 2400 V </td><td bgcolor="#FFFFFF"> 2400 V </td><td bgcolor="#FFFFFF"> 2300 V </td><td bgcolor="#FFFFFF"> 2400 V </td><td bgcolor="#FFFFFF"> 2400 V </td><td bgcolor="#FFFFFF"> nom voltages <br/> conditioning in longer beam breaks </td><td bgcolor="#FFFFFF"> JF </td></tr>
+<tr><td class="twikiFirstCol" bgcolor="#FFFFCC"> 4 </td><td bgcolor="#FFFFCC"> 07 Apr 14:12 </td><td bgcolor="#FFFFCC"> </td><td bgcolor="#FFFFCC"> </td><td bgcolor="#FFFFCC"> </td><td bgcolor="#FFFFCC"> 2400 V </td><td bgcolor="#FFFFCC"> </td><td bgcolor="#FFFFCC"> </td><td bgcolor="#FFFFCC"> condit. </td><td bgcolor="#FFFFCC"> LM </td></tr>
+<tr><td class="twikiFirstCol" bgcolor="#FFFFFF"> 5 </td><td bgcolor="#FFFFFF"> 07 Apr 14:30 </td><td bgcolor="#FFFFFF"> </td><td bgcolor="#FFFFFF"> </td><td bgcolor="#FFFFFF"> </td><td bgcolor="#FFFFFF"> 2450 V </td><td bgcolor="#FFFFFF"> </td><td bgcolor="#FFFFFF"> </td><td bgcolor="#FFFFFF"> condit. </td><td bgcolor="#FFFFFF"> LM </td></tr>
+<tr><td class="twikiFirstCol" bgcolor="#FFFFCC"> 6 </td><td bgcolor="#FFFFCC"> 07 Apr 14:35 </td><td bgcolor="#FFFFCC"> </td><td bgcolor="#FFFFCC"> </td><td bgcolor="#FFFFCC"> 2450 V </td><td bgcolor="#FFFFCC"> </td><td bgcolor="#FFFFCC"> </td><td bgcolor="#FFFFCC"> </td><td bgcolor="#FFFFCC"> condit. </td><td bgcolor="#FFFFCC"> LM </td></tr>
+<tr><td class="twikiFirstCol" bgcolor="#FFFFFF"> 7 </td><td bgcolor="#FFFFFF"> 07 Apr 19:37 </td><td bgcolor="#FFFFFF"> 1900 V </td><td bgcolor="#FFFFFF"> 1900 V </td><td bgcolor="#FFFFFF"> 1900 V </td><td bgcolor="#FFFFFF"> 1900 V </td><td bgcolor="#FFFFFF"> 1900 V </td><td bgcolor="#FFFFFF"> 1900 V </td><td bgcolor="#FFFFFF"> Beam is back, first be careful </td><td bgcolor="#FFFFFF"> LM </td></tr>
+<tr><td class="twikiFirstCol" bgcolor="#FFFFCC"> 8 </td><td bgcolor="#FFFFCC"> 07 Apr 19:49 </td><td bgcolor="#FFFFCC"> 2200 V </td><td bgcolor="#FFFFCC"> 2200 V </td><td bgcolor="#FFFFCC"> 2200 V </td><td bgcolor="#FFFFCC"> 2200 V </td><td bgcolor="#FFFFCC"> 2200 V </td><td bgcolor="#FFFFCC"> 2200 V </td><td bgcolor="#FFFFCC"> </td><td bgcolor="#FFFFCC"> LM </td></tr>
+<tr><td class="twikiFirstCol" bgcolor="#FFFFFF"> 9 </td><td bgcolor="#FFFFFF"> 07 Apr 19:54 </td><td bgcolor="#FFFFFF"> 2400 V </td><td bgcolor="#FFFFFF"> 2400 V </td><td bgcolor="#FFFFFF"> 2400 V </td><td bgcolor="#FFFFFF"> 2250 V </td><td bgcolor="#FFFFFF"> 2400 V </td><td bgcolor="#FFFFFF"> 2400 V </td><td bgcolor="#FFFFFF"> </td><td bgcolor="#FFFFFF"> LM </td></tr>
+<tr><td class="twikiFirstCol" bgcolor="#FFFFCC"> 10 </td><td bgcolor="#FFFFCC"> 07 Apr 22:38 </td><td bgcolor="#FFFFCC"> </td><td bgcolor="#FFFFCC"> </td><td bgcolor="#FFFFCC"> </td><td bgcolor="#FFFFCC"> <img src="http://hades-wiki.gsi.de/pub/TWiki/SmiliesPlugin/frown.gif" alt="frown" title="frown" border="0" /> <img src="http://hades-wiki.gsi.de/pub/TWiki/SmiliesPlugin/frown.gif" alt="frown" title="frown" border="0" /> ... </td><td bgcolor="#FFFFCC"> </td><td bgcolor="#FFFFCC"> </td><td bgcolor="#FFFFCC"> since 9pm seven trips in S4 </td><td bgcolor="#FFFFCC"> JS </td></tr>
+<tr><td class="twikiFirstCol" bgcolor="#FFFFFF"> 11 </td><td bgcolor="#FFFFFF"> 07 Apr 23:12 </td><td bgcolor="#FFFFFF"> </td><td bgcolor="#FFFFFF"> </td><td bgcolor="#FFFFFF"> </td><td bgcolor="#FFFFFF"> <img src="http://hades-wiki.gsi.de/pub/TWiki/SmiliesPlugin/frown.gif" alt="frown" title="frown" border="0" /> </td><td bgcolor="#FFFFFF"> </td><td bgcolor="#FFFFFF"> </td><td bgcolor="#FFFFFF"> </td><td bgcolor="#FFFFFF"> </td></tr>
+</table>
+<input type="hidden" name="etrows" value="12" />
+<input type="image" src="http://hades-wiki.gsi.de/pub/TWiki/EditTablePlugin/edittable.gif" alt="Edit this table" /></form>
+<p />
+-- <a class="twikiLink" href="/cgi-bin/view/Main/JuergenFriese?CGISESSID=001ebab3a3dda66197b9b2232214db2b">JuergenFriese</a> - 02 Apr 2012
+<br class="twikiClear" />
+<a name="TopicEnd"></a>
+<span class="twikiRight twikiPageNav twikiGrayText"><a href="?CGISESSID=001ebab3a3dda66197b9b2232214db2b&CGISESSID=001ebab3a3dda66197b9b2232214db2b#PageTop">to top</a></span><br class="twikiClear" />
+</div><div class="twikiHidden"><hr />End of topic<br /><a href="?CGISESSID=001ebab3a3dda66197b9b2232214db2b&CGISESSID=001ebab3a3dda66197b9b2232214db2b#Actions">Skip to action links</a> | <a href="?CGISESSID=001ebab3a3dda66197b9b2232214db2b&CGISESSID=001ebab3a3dda66197b9b2232214db2b#PageTop">Back to top</a><hr /></div>
+<!---->
+<!---->
+<a name="Actions"> </a><span class="twikiHidden"><br /></span><div class="twikiTopicAction">
+<a href="/cgi-bin/edit/RICH/Apr7?t=1333835507&CGISESSID=001ebab3a3dda66197b9b2232214db2b&CGISESSID=001ebab3a3dda66197b9b2232214db2b"><b>Edit</b></a>
+<span class="twikiSeparator">|</span> <a href="/cgi-bin/attach/RICH/Apr7?CGISESSID=001ebab3a3dda66197b9b2232214db2b&CGISESSID=001ebab3a3dda66197b9b2232214db2b">Attach image or document</a>
+<span class="twikiSeparator">|</span> <a href="/cgi-bin/view/RICH/Apr7?skin=print.pattern&CGISESSID=001ebab3a3dda66197b9b2232214db2b&CGISESSID=001ebab3a3dda66197b9b2232214db2b">Printable version</a>
+[<a href="/cgi-bin/genpdf/RICH/Apr7?CGISESSID=001ebab3a3dda66197b9b2232214db2b&CGISESSID=001ebab3a3dda66197b9b2232214db2b">PDF</a>]
+<span class="twikiSeparator">|</span> <a href="/cgi-bin/view/RICH/Apr7?raw=on&CGISESSID=001ebab3a3dda66197b9b2232214db2b&CGISESSID=001ebab3a3dda66197b9b2232214db2b">Raw text</a>
+<span class="twikiSeparator">|</span> <a href="/cgi-bin/oops/RICH/Apr7?template=oopsmore&param1=1.7&param2=1.7&CGISESSID=001ebab3a3dda66197b9b2232214db2b&CGISESSID=001ebab3a3dda66197b9b2232214db2b">More topic actions</a>
+<br />Revisions: | r1.7 | <a href="/cgi-bin/rdiff/RICH/Apr7?rev1=1.7&rev2=1.6&CGISESSID=001ebab3a3dda66197b9b2232214db2b&CGISESSID=001ebab3a3dda66197b9b2232214db2b">></a> | <a href="/cgi-bin/view/RICH/Apr7?rev=1.6&CGISESSID=001ebab3a3dda66197b9b2232214db2b&CGISESSID=001ebab3a3dda66197b9b2232214db2b">r1.6</a> | <a href="/cgi-bin/rdiff/RICH/Apr7?rev1=1.6&rev2=1.5&CGISESSID=001ebab3a3dda66197b9b2232214db2b&CGISESSID=001ebab3a3dda66197b9b2232214db2b">></a> | <a href="/cgi-bin/view/RICH/Apr7?rev=1.5&CGISESSID=001ebab3a3dda66197b9b2232214db2b&CGISESSID=001ebab3a3dda66197b9b2232214db2b">r1.5</a>
+<span class="twikiSeparator">|</span> <a href="/cgi-bin/rdiff/RICH/Apr7?CGISESSID=001ebab3a3dda66197b9b2232214db2b&CGISESSID=001ebab3a3dda66197b9b2232214db2b">Total page history</a>
+<span class="twikiSeparator">|</span> <a href="/cgi-bin/search/RICH/SearchResult?scope=text&regex=on&excludetopic=Apr7&search=Apr%20*7%5B%5EA-Za-z0-9%5D&CGISESSID=001ebab3a3dda66197b9b2232214db2b&CGISESSID=001ebab3a3dda66197b9b2232214db2b">Backlinks</a>
+<span class="twikiSeparator">|</span> <a target="wikigraph" onClick="open('/cgi-bin/view/RICH/Apr7?skin=tglaunch', 'wikigraph', 'titlebar=0,width=600,height=600,resizable,scrollbars'); return false" href="/cgi-bin/view/RICH/Apr7?skin=tglaunch title=&CGISESSID=001ebab3a3dda66197b9b2232214db2b&CGISESSID=001ebab3a3dda66197b9b2232214db2b"The topology of the topics in this web (java applet)">Graph</a>
+</div>
+<div class="twikiTopicInfo twikiRevInfo twikiGrayText twikiMoved"></div>
+<div class="twikiTopicFooter"><span class="twikiLeft"><span class="twikiHomePath">You are here: <a class="twikiLink" href="/cgi-bin/view/RICH/WebHome?CGISESSID=001ebab3a3dda66197b9b2232214db2b&CGISESSID=001ebab3a3dda66197b9b2232214db2b">RICH</a> <span class='twikiSeparator'>></span> <a class="twikiLink" href="/cgi-bin/view/RICH/Apr12HighVoltageTrips?CGISESSID=001ebab3a3dda66197b9b2232214db2b&CGISESSID=001ebab3a3dda66197b9b2232214db2b">Apr12HighVoltageTrips</a> <span class='twikiSeparator'>></span> Apr7 </span></span><span class="twikiHidden"><br /><br /></span><span class="twikiRight twikiPageNav twikiGrayText"><a href="?CGISESSID=001ebab3a3dda66197b9b2232214db2b&CGISESSID=001ebab3a3dda66197b9b2232214db2b#PageTop">to top</a></span><br class="twikiClear" /><span class="twikiHidden"><br /></span></div>
+<a name="PageBottom"></a> </div></div><div class="twikiBottomBar"><div class="twikiBottomBarContents"><span class="twikiGrayText">Copyright © 1999-2012 by the contributing authors.
+All material on this collaboration platform is the property of the contributing authors. <br />
+Ideas, requests, problems regarding Hades Wiki? <a href="mailto:wiki-admin@gsi.de?subject=Hades Wiki Feedback on TWiki.WebBottomBar">Send feedback</a>
+</span></div></div>
+</body></html>
\ No newline at end of file
--- /dev/null
+#!/usr/bin/perl
+
+use warnings;
+use strict;
+use Data::Dumper;
+# use Hmon;
+
+use lib '/home/scs/EPICS/gcc-4.4/EPICS-3.14.12.2_linux-x86_64/base/' . '/lib/perl';
+
+use Getopt::Std;
+use CA;
+$ENV{EPICS_CA_AUTO_ADDR_LIST} = 'YES';
+$ENV{EPICS_CA_ADDR_LIST} = "192.168.100.11 192.168.100.12 192.168.100.13 192.168.100.14 192.168.100.15 localhost";
+
+our ($opt_0, $opt_c, $opt_e, $opt_f, $opt_g, $opt_h, $opt_l,
+ $opt_n, $opt_s, $opt_t);
+our $opt_w = 1;
+
+$Getopt::Std::OUTPUT_HELP_VERSION = 1;
+
+HELP_MESSAGE() unless getopts('achlnstw:');
+HELP_MESSAGE() if $opt_h;
+
+die "No pv name specified. ('caput -h' gives help.)\n"
+ unless @ARGV;
+my $pv = shift;
+
+die "No value specified. ('caput -h' gives help.)\n"
+ unless @ARGV;
+
+my $chan = CA->new($pv);
+eval {
+ CA->pend_io($opt_w);
+};
+if ($@) {
+ if ($@ =~ m/^ECA_TIMEOUT/) {
+ print "Channel connect timed out: '$pv' not found.\n";
+ exit 2;
+ } else {
+ die $@;
+ }
+}
+
+die "Write access denied for '$pv'.\n" unless $chan->write_access;
+
+my $n = $chan->element_count();
+die "Too many values given, '$pv' limit is $n\n"
+ unless $n >= @ARGV;
+
+my $type = $chan->field_type;
+$type = 'DBR_STRING'
+ if $opt_s && $type =~ m/ ^DBR_ENUM$ | ^DBR_FLOAT$ | ^DBR_DOUBLE$ /x;
+$type = 'DBR_LONG'
+ if $opt_n && $type eq 'DBR_ENUM';
+$type =~ s/^DBR_/DBR_TIME_/
+ if $opt_l;
+
+my @values;
+if ($type !~ m/ ^DBR_STRING$ | ^DBR_ENUM$ /x) {
+ # Make @ARGV strings numeric
+ @values = map { +$_; } @ARGV;
+} else {
+ # Use strings
+ @values = @ARGV;
+}
+
+my $done = 0;
+if ($opt_t) {
+ do_put();
+} else {
+ $chan->get_callback(\&old_callback, $type);
+}
+CA->pend_event(0.1) until $done;
+
+
+sub old_callback {
+ my ($chan, $status, $data) = @_;
+ die $status if $status;
+ display($chan, $type, $data, 'Old');
+ do_put();
+}
+
+sub do_put {
+ if ($opt_c) {
+ $chan->put_callback(\&put_callback, @values);
+ } else {
+ $chan->put(@values);
+ $chan->get_callback(\&new_callback, $type);
+ }
+}
+
+sub put_callback {
+ my ($chan, $status) = @_;
+ die $status if $status;
+ $chan->get_callback(\&new_callback, $type);
+}
+
+sub new_callback {
+ my ($chan, $status, $data) = @_;
+ die $status if $status;
+ display($chan, $type, $data, 'New');
+ $done = 1;
+}
+
+sub format_number {
+ my ($data, $type) = @_;
+ if ($type =~ m/_DOUBLE$/) {
+ return sprintf "%.${opt_e}e", $data if $opt_e;
+ return sprintf "%.${opt_f}f", $data if $opt_f;
+ return sprintf "%.${opt_g}g", $data if $opt_g;
+ }
+ if ($type =~ m/_LONG$/) {
+ return sprintf "%lx", $data if $opt_0 eq 'x';
+ return sprintf "%lo", $data if $opt_0 eq 'o';
+ if ($opt_0 eq 'b') {
+ my $bin = unpack "B*", pack "l", $data;
+ $bin =~ s/^0*//;
+ return $bin;
+ }
+ }
+ return $data;
+}
+
+sub display {
+ my ($chan, $type, $data, $prefix) = @_;
+ if (ref $data eq 'ARRAY') {
+ display($chan, $type, join(' ', @{$data}), $prefix);
+ } elsif (ref $data eq 'HASH') {
+ $type = $data->{TYPE}; # Can differ from request
+ my $value = $data->{value};
+ if (ref $value eq 'ARRAY') {
+ $value = join(' ', map { format_number($_, $type); } @{$value});
+ } else {
+ $value = format_number($value, $type);
+ }
+ my $stamp;
+ if (exists $data->{stamp}) {
+ my @t = localtime $data->{stamp};
+ splice @t, 6;
+ $t[5] += 1900;
+ $t[0] += $data->{stamp_fraction};
+ $stamp = sprintf "%4d-%02d-%02d %02d:%02d:%09.6f", reverse @t;
+ }
+ printf "%-30s %s %s %s %s\n", $chan->name,
+ $stamp, $value, $data->{status}, $data->{severity};
+ } else {
+ my $value = format_number($data, $type);
+ if ($opt_t) {
+ print "$value\n";
+ } else {
+ printf "$prefix : %-30s %s\n", $chan->name, $value;
+ }
+ }
+}
+
+sub HELP_MESSAGE {
+ print STDERR "\nUsage: caput [options] <PV name> <PV value> ...\n",
+ "\n",
+ " -h: Help: Print this message\n",
+ "Channel Access options:\n",
+ " -w <sec>: Wait time, specifies longer CA timeout, default is $opt_w second\n",
+ " -c: Use put_callback to wait for completion\n",
+ "Format options:\n",
+ " -t: Terse mode - print only sucessfully written value, without name\n",
+ " -l: Long mode \"name timestamp value stat sevr\" (read PVs as DBR_TIME_xxx)\n",
+ "Enum format:\n",
+ " Default: Auto - try value as ENUM string, then as index number\n",
+ " -n: Force interpretation of values as numbers\n",
+ " -s: Force interpretation of values as strings\n",
+ "Floating point type format:\n",
+ " Default: Use %g format\n",
+ " -e <nr>: Use %e format, with a precision of <nr> digits\n",
+ " -f <nr>: Use %f format, with a precision of <nr> digits\n",
+ " -g <nr>: Use %g format, with a precision of <nr> digits\n",
+ " -s: Get value as string (may honour server-side precision)\n",
+ "Integer number format:\n",
+ " Default: Print as decimal number\n",
+ " -0x: Print as hex number\n",
+ " -0o: Print as octal number\n",
+ " -0b: Print as binary number\n",
+ "\n",
+ "Examples:\n",
+ " caput my_channel 1.2\n",
+ " caput my_waveform 1.2 2.4 3.6 4.8 6.0\n",
+ "\n";
+ exit 1;
+}
+
--- /dev/null
+#!/usr/bin/env perl
+#
+# formfind.pl
+#
+# This script gets a HTML page on stdin and presents form information on
+# stdout.
+#
+# Author: Daniel Stenberg <daniel@haxx.se>
+# Version: 0.2 Nov 18, 2002
+#
+# HISTORY
+#
+# 0.1 - Nov 12 1998 - Created now!
+# 0.2 - Nov 18 2002 - Enhanced. Removed URL support, use only stdin.
+#
+
+$in="";
+
+if($ARGV[0] eq "-h") {
+ print "Usage: $0 < HTML\n";
+ exit;
+}
+
+sub namevalue {
+ my ($tag)=@_;
+ my $name=$tag;
+ if($name =~ /name *=/i) {
+ if($name =~ /name *= *([^\"\']([^ \">]*))/i) {
+ $name = $1;
+ }
+ elsif($name =~ /name *= *(\"|\')([^\"\']*)(\"|\')/i) {
+ $name=$2;
+ }
+ else {
+ # there is a tag but we didn't find the contents
+ $name="[weird]";
+ }
+
+ }
+ else {
+ # no name given
+ $name="";
+ }
+ # get value tag
+ my $value= $tag;
+ if($value =~ /[^\.a-zA-Z0-9]value *=/i) {
+ if($value =~ /[^\.a-zA-Z0-9]value *= *([^\"\']([^ \">]*))/i) {
+ $value = $1;
+ }
+ elsif($value =~ /[^\.a-zA-Z0-9]value *= *(\"|\')([^\"\']*)(\"|\')/i) {
+ $value=$2;
+ }
+ else {
+ # there is a tag but we didn't find the contents
+ $value="[weird]";
+ }
+ }
+ else {
+ $value="";
+ }
+ return ($name, $value);
+}
+
+
+while(<STDIN>) {
+ $line = $_;
+ push @indoc, $line;
+ $line=~ s/\n//g;
+ $line=~ s/\r//g;
+ $in=$in.$line;
+}
+
+while($in =~ /[^<]*(<[^>]+>)/g ) {
+ # we have a tag in $1
+ $tag = $1;
+
+ if($tag =~ /^<!--/) {
+ # this is a comment tag, ignore it
+ }
+ else {
+ if(!$form &&
+ ($tag =~ /^< *form/i )) {
+ $method= $tag;
+ if($method =~ /method *=/i) {
+ $method=~ s/.*method *= *(\"|)([^ \">]*).*/$2/gi;
+ }
+ else {
+ $method="get"; # default method
+ }
+ $action= $tag;
+ $action=~ s/.*action *= *(\'|\"|)([^ \"\'>]*).*/$2/gi;
+
+ $method=uc($method);
+
+ $enctype=$tag;
+ if ($enctype =~ /enctype *=/) {
+ $enctype=~ s/.*enctype *= *(\'|\"|)([^ \"\'>]*).*/$2/gi;
+
+ if($enctype eq "multipart/form-data") {
+ $enctype="multipart form upload [use -F]"
+ }
+ $enctype = "\n--- type: $enctype";
+ }
+ else {
+ $enctype="";
+ }
+
+ print "--- FORM report. Uses $method to URL \"$action\"$enctype\n";
+ $form=1;
+ }
+ elsif($form &&
+ ($tag =~ /< *\/form/i )) {
+
+ print "--- end of FORM\n";
+ $form=0;
+ if( 0 ) {
+ print "*** Fill in all or any of these: (default assigns may be shown)\n";
+ for(@vars) {
+ $var = $_;
+ $def = $value{$var};
+ print "$var=$def\n";
+ }
+ print "*** Pick one of these:\n";
+ for(@alts) {
+ print "$_\n";
+ }
+ }
+ undef @vars;
+ undef @alts;
+ }
+ elsif($form &&
+ ($tag =~ /^< *(input|select)/i)) {
+ $mtag = $1;
+
+ ($name, $value)=namevalue($tag);
+
+ if($mtag =~ /select/i) {
+ print "Select: NAME=\"$name\"\n";
+ push @vars, "$name";
+ $select = 1;
+ }
+ else {
+ $type=$tag;
+ if($type =~ /type *=/i) {
+ $type =~ s/.*type *= *(\'|\"|)([^ \"\'>]*).*/$2/gi;
+ }
+ else {
+ $type="text"; # default type
+ }
+ $type=uc($type);
+ if(lc($type) eq "reset") {
+ # reset types are for UI only, ignore.
+ }
+ elsif($name eq "") {
+ # let's read the value parameter
+
+ print "Button: \"$value\" ($type)\n";
+ push @alts, "$value";
+ }
+ else {
+ print "Input: NAME=\"$name\"";
+ if($value ne "") {
+ print " VALUE=\"$value\"";
+ }
+ print " ($type)\n";
+ push @vars, "$name";
+ # store default value:
+ $value{$name}=$value;
+ }
+ }
+ }
+ elsif($form &&
+ ($tag =~ /^< *textarea/i)) {
+ my ($name, $value)=namevalue($tag);
+
+ print "Textarea: NAME=\"$name\"\n";
+ }
+ elsif($select) {
+ if($tag =~ /^< *\/ *select/i) {
+ print "[end of select]\n";
+ $select = 0;
+ }
+ elsif($tag =~ /[^\/] *option/i ) {
+ my ($name, $value)=namevalue($tag);
+ my $s;
+ if($tag =~ /selected/i) {
+ $s= " (SELECTED)";
+ }
+ print " Option VALUE=\"$value\"$s\n";
+ }
+ }
+ }
+}
--- /dev/null
+#!/usr/bin/perl -w
+
+use warnings;
+use strict;
+use Time::HiRes qw( gettimeofday usleep time );
+use feature qw/switch/;
+use Data::Dumper;
+use Perl2Epics;
+
+#Trip-States
+use constant {
+ IDLE => 1,
+ WAIT_HV_DOWN => 2,
+ WAIT => 3,
+ HV_ON => 4,
+ RESET => 5
+};
+my $tripState = IDLE;
+my $tripCtr = 0;
+my $tripTime = 0;
+
+my $caput = "/home/scs/epics/base-3.14.10/bin/linux-x86/caput";
+my $button_4 = "HAD:RICH:HV:PS:C3:pwonoff";
+
+#For Read
+Perl2Epics::Connect("VMON_4", "HAD:RICH:HV:PS:C3:vmon");
+Perl2Epics::Connect("IMON_4", "HAD:RICH:HV:PS:C3:imon");
+Perl2Epics::Connect("TRIPS_4", "HAD:RICH:HV:PS:TRIPCOUNT_C3");
+Perl2Epics::Connect("VMON_SET_4", "HAD:RICH:HV:PS:C3:v0set:fbk");
+Perl2Epics::Connect("STATUS_4", "HAD:RICH:HV:PS:C3:status", "DBR_TIME_ENUM");
+# For write
+Perl2Epics::Connect("HV_BUTTON", "HAD:RICH:HV:PS:C3:pwonoff", "DBR_TIME_ENUM");
+
+my $numVariables = 6;
+my $aliveCtr = 0;
+my %lastValue;
+
+while (1) {
+ sleep(1);
+ $tripTime++ unless ($tripCtr == 0);
+ my $value = Perl2Epics::GetAll();
+ #print Dumper $value;
+ if (keys %$value != $numVariables) {
+ print STDERR "Incomplete Epics List\n";
+ next;
+ }
+
+ my @changed;
+ foreach my $key (keys %$value) {
+ if (defined $value->{$key} && defined $lastValue{$key}) {
+ if ($value->{$key}->{'tme'} != $lastValue{$key}->{'tme'}) {
+ push(@changed, $key);
+ #print "$key: V: $value->{$key}->{'val'}" .
+ # " T: $value->{$key}->{'tme'} \n";
+ }
+ }
+ }
+
+ %lastValue = %$value;
+# print Dumper @changed;
+
+ given ($tripState) {
+ when (IDLE) {
+ # Wait for a new Trip:
+ if (($value->{'STATUS_4'}->{'val'} =~ "Internal Trip") &&
+ ($value->{'TRIPS_4'}->{'val'} >= 5 )) {
+ $tripState = WAIT_HV_DOWN;
+ $tripCtr++;
+ print "Trip #$tripCtr detected on Sector #4 @ ".
+ localtime."\n";
+ if (($tripTime < 180) && ($tripCtr > 1)) {
+ die "giving up, Time since last Trip: $tripTime below 3min";
+ }
+ $tripTime = 0;
+ } else {
+ $aliveCtr++;
+ if ($aliveCtr > 30) {
+ $aliveCtr = 0;
+ print "Status O.K., ".localtime.
+ " TripCtr: $tripCtr Time since last ramp up: $tripTime\n";
+ }
+ }
+ }
+
+ when (WAIT_HV_DOWN) {
+ if (($value->{'STATUS_4'}->{'val'} =~ "Internal Trip") &&
+ ($value->{'TRIPS_4'}->{'val'} >= 5 )) {
+ if (($value->{'VMON_4'}->{'val'} < 10) &&
+ ($value->{'IMON_4'}->{'val'} < 0.01)) {
+ $tripState = WAIT;
+ print "HV is down\n";
+ } else {
+ print "Waiting for HV Down: ".
+ "VMON_4: ".$value->{'VMON_4'}->{'val'}.
+ " IMON_4: ".$value->{'IMON_4'}->{'val'}.
+ "\n";
+ }
+ } else {
+ # Status changed, abort TripMachine
+ $tripState = IDLE;
+ print "State changed, aborting, go to IDLE again\n";
+ }
+ }
+
+ when (WAIT) {
+ print "Wait another 240 seconds\n";
+ sleep(240);
+ $tripState = HV_ON;
+ }
+
+ when (HV_ON) {
+ print "Turn HV on again\n";
+ Perl2Epics::Put("HV_BUTTON", "On");
+ $tripState = RESET;
+ }
+
+ when (RESET) {
+ sleep(10);
+ print "Done, waiting for next trip #".($tripCtr + 1)."\n\n";
+ $tripState = IDLE;
+ }
+
+ default {
+ die "Invalid TripState, aborting process";
+ }
+ }
+}
--- /dev/null
+#!/usr/bin/perl -w
+
+use warnings;
+use strict;
+use Time::HiRes qw( gettimeofday usleep time );
+use feature qw/switch/;
+use Data::Dumper;
+use Perl2Epics;
+
+#Trip-States
+use constant {
+ IDLE => 1,
+ WAIT_HV_DOWN => 2,
+ WAIT => 3,
+ HV_OFF => 4,
+ HV_ON => 5,
+ RESET => 6
+};
+my $tripState = IDLE;
+my $tripCtr = 0;
+my $tripTime = 0;
+
+my $caput = "/home/scs/epics/base-3.14.10/bin/linux-x86/caput";
+my $button_4 = "HAD:RICH:HV:PS:C3:pwonoff";
+
+#For Read
+Perl2Epics::Connect("VMON_4", "HAD:RICH:HV:PS:C3:vmon");
+Perl2Epics::Connect("IMON_4", "HAD:RICH:HV:PS:C3:imon");
+Perl2Epics::Connect("TRIPS_4", "HAD:RICH:HV:PS:TRIPCOUNT_C3");
+Perl2Epics::Connect("VMON_SET_4", "HAD:RICH:HV:PS:C3:v0set:fbk");
+Perl2Epics::Connect("STATUS_4", "HAD:RICH:HV:PS:C3:status", "DBR_TIME_ENUM");
+# For write
+Perl2Epics::Connect("HV_BUTTON", "HAD:RICH:HV:PS:C3:pwonoff", "DBR_TIME_ENUM");
+
+my $numVariables = 6;
+my $aliveCtr = 0;
+my %lastValue;
+
+while (1) {
+ sleep(1);
+ $tripTime++ unless ($tripCtr == 0);
+ my $value = Perl2Epics::GetAll();
+ #print Dumper $value;
+ if (keys %$value != $numVariables) {
+ print STDERR "Incomplete Epics List\n";
+ next;
+ }
+
+ my @changed;
+ foreach my $key (keys %$value) {
+ if (defined $value->{$key} && defined $lastValue{$key}) {
+ if ($value->{$key}->{'tme'} != $lastValue{$key}->{'tme'}) {
+ push(@changed, $key);
+ #print "$key: V: $value->{$key}->{'val'}" .
+ # " T: $value->{$key}->{'tme'} \n";
+ }
+ }
+ }
+
+ %lastValue = %$value;
+# print Dumper @changed;
+
+ given ($tripState) {
+ when (IDLE) {
+ # Wait for a new Trip:
+ if (($value->{'STATUS_4'}->{'val'} =~ "Internal Trip")
+# &&
+# ($value->{'TRIPS_4'}->{'val'} >= 5 )) ||
+ ) {
+ $tripState = WAIT_HV_DOWN;
+ $tripCtr++;
+ print "Trip #$tripCtr detected on Sector #4 @ ".
+ localtime."\n";
+# if (($tripTime < 180) && ($tripCtr > 1)) {
+# die "giving up, Time since last Trip: $tripTime below 3min";
+# }
+ $tripTime = 0;
+ } else {
+ $aliveCtr++;
+ if ($aliveCtr > 30) {
+ $aliveCtr = 0;
+ print "Status O.K., ".localtime.
+ " TripCtr: $tripCtr Time since last ramp up: $tripTime\n";
+ }
+ }
+ }
+
+ when (WAIT_HV_DOWN) {
+
+ if (($value->{'VMON_4'}->{'val'} > 10) ||
+ ($value->{'IMON_4'}->{'val'} > 0.1)) {
+ $tripState = HV_OFF;
+ print "Waiting for switching HV off: ".
+ "VMON_4: ".$value->{'VMON_4'}->{'val'}.
+ "IMON_4: ".$value->{'IMON_4'}->{'val'}.
+ "\n";
+ } else {
+ $tripState = WAIT;
+ print "HV is down\n";
+# print "Waiting for HV Down: ".
+# "VMON_4: ".$value->{'VMON_4'}->{'val'}.
+# " IMON_4: ".$value->{'IMON_4'}->{'val'}.
+# "\n";
+ }
+#
+# } else {
+# # Status changed, abort TripMachine
+# $tripState = IDLE;
+# print "State changed, aborting, go to IDLE again\n";
+# }
+ }
+
+ when (WAIT) {
+ print "Wait another 240 seconds\n";
+ sleep(240);
+ $tripState = HV_ON;
+ }
+
+ when (HV_OFF) {
+ print "Force HV off\n";
+ Perl2Epics::Put("HV_BUTTON", "Off");
+ $tripState = WAIT_HV_DOWN;
+ }
+
+ when (HV_ON) {
+ print "Turn HV on again\n";
+ Perl2Epics::Put("HV_BUTTON", "On");
+ $tripState = RESET;
+ }
+
+ when (RESET) {
+ sleep(10);
+ print "Done, waiting for next trip #".($tripCtr + 1)."\n\n";
+ $tripState = IDLE;
+ }
+
+ default {
+ die "Invalid TripState, aborting process";
+ }
+ }
+}