@page
|
@model EditModel
|
@{
|
ViewData["Title"] = $"编辑实例 - {Model.Input.Id}";
|
}
|
|
<div class="row justify-content-center">
|
<div class="col-lg-8">
|
<div class="card shadow">
|
<div class="card-header bg-warning text-dark">
|
<h4 class="mb-0">
|
<i class="bi bi-pencil-square me-2"></i>编辑实例: @Model.Input.Id
|
</h4>
|
</div>
|
<div class="card-body">
|
@if (Model.IsRunning)
|
{
|
<div class="alert alert-warning d-flex align-items-center" role="alert">
|
<i class="bi bi-exclamation-triangle-fill flex-shrink-0 me-2"></i>
|
<div>
|
<strong>警告:</strong> 实例正在运行中。某些配置修改可能需要重启实例才能生效。
|
</div>
|
</div>
|
}
|
|
<form method="post" id="editForm">
|
<div asp-validation-summary="ModelOnly" class="alert alert-danger" role="alert"></div>
|
|
<!-- 基本信息 -->
|
<h5 class="mb-3">
|
<i class="bi bi-info-circle me-2"></i>基本信息
|
</h5>
|
|
<div class="row mb-3">
|
<div class="col-md-6">
|
<label class="form-label">实例ID</label>
|
<input type="text" class="form-control" value="@Model.Input.Id" disabled />
|
<small class="text-muted">实例ID不可修改</small>
|
</div>
|
<div class="col-md-6">
|
<label asp-for="Input.Name" class="form-label required">实例名称</label>
|
<input asp-for="Input.Name" class="form-control" />
|
<span asp-validation-for="Input.Name" class="text-danger"></span>
|
</div>
|
</div>
|
|
<div class="row mb-3">
|
<div class="col-md-6">
|
<label asp-for="Input.PLCType" class="form-label required">PLC型号</label>
|
@if (Model.IsRunning)
|
{
|
<select asp-for="Input.PLCType" class="form-select" disabled>
|
<option value="0">S7-200 Smart</option>
|
<option value="1">S7-1200</option>
|
<option value="2">S7-1500</option>
|
<option value="3">S7-300</option>
|
<option value="4">S7-400</option>
|
</select>
|
<small class="text-muted">运行中不可修改</small>
|
}
|
else
|
{
|
<select asp-for="Input.PLCType" class="form-select">
|
<option value="0">S7-200 Smart</option>
|
<option value="1">S7-1200</option>
|
<option value="2">S7-1500</option>
|
<option value="3">S7-300</option>
|
<option value="4">S7-400</option>
|
</select>
|
}
|
<span asp-validation-for="Input.PLCType" class="text-danger"></span>
|
</div>
|
<div class="col-md-6">
|
<label asp-for="Input.Port" class="form-label required">监听端口</label>
|
@if (Model.IsRunning)
|
{
|
<input asp-for="Input.Port" class="form-control" type="number" min="1" max="65535" disabled />
|
<small class="text-muted">运行中不可修改</small>
|
}
|
else
|
{
|
<input asp-for="Input.Port" class="form-control" type="number" min="1" max="65535" />
|
}
|
<span asp-validation-for="Input.Port" class="text-danger"></span>
|
</div>
|
</div>
|
|
<div class="row mb-3">
|
<div class="col-md-6">
|
<label asp-for="Input.ActivationKey" class="form-label">HSL激活码</label>
|
<input asp-for="Input.ActivationKey" class="form-control" placeholder="可选" />
|
<span asp-validation-for="Input.ActivationKey" class="text-danger"></span>
|
</div>
|
<div class="col-md-6">
|
<label asp-for="Input.AutoStart" class="form-label">自动启动</label>
|
<div class="form-check mt-2">
|
<input asp-for="Input.AutoStart" class="form-check-input" />
|
<label asp-for="Input.AutoStart" class="form-check-label">
|
服务器启动时自动启动此实例
|
</label>
|
</div>
|
</div>
|
</div>
|
|
<hr class="my-4">
|
|
<!-- 内存配置 -->
|
<div class="d-flex justify-content-between align-items-center mb-3">
|
<h5 class="mb-0">
|
<i class="bi bi-memory me-2"></i>内存配置
|
</h5>
|
<button type="button" class="btn btn-outline-secondary btn-sm" onclick="resetMemoryConfig()">
|
<i class="bi bi-arrow-counterclockwise me-1"></i>重置为默认值
|
</button>
|
</div>
|
|
<div class="row mb-3">
|
<div class="col-md-4">
|
<label asp-for="Input.MRegionSize" class="form-label">M区域大小</label>
|
<input asp-for="Input.MRegionSize" class="form-control" type="number" min="0" placeholder="1024" />
|
<span asp-validation-for="Input.MRegionSize" class="text-danger"></span>
|
</div>
|
<div class="col-md-4">
|
<label asp-for="Input.IRegionSize" class="form-label">I区域大小</label>
|
<input asp-for="Input.IRegionSize" class="form-control" type="number" min="0" placeholder="256" />
|
<span asp-validation-for="Input.IRegionSize" class="text-danger"></span>
|
</div>
|
<div class="col-md-4">
|
<label asp-for="Input.QRegionSize" class="form-label">Q区域大小</label>
|
<input asp-for="Input.QRegionSize" class="form-control" type="number" min="0" placeholder="256" />
|
<span asp-validation-for="Input.QRegionSize" class="text-danger"></span>
|
</div>
|
</div>
|
|
<div class="row mb-3">
|
<div class="col-md-4">
|
<label asp-for="Input.DBBlockCount" class="form-label">DB块数量</label>
|
<input asp-for="Input.DBBlockCount" class="form-control" type="number" min="0" placeholder="100" />
|
<span asp-validation-for="Input.DBBlockCount" class="text-danger"></span>
|
</div>
|
<div class="col-md-4">
|
<label asp-for="Input.DBBlockSize" class="form-label">DB块大小</label>
|
<input asp-for="Input.DBBlockSize" class="form-control" type="number" min="0" placeholder="1024" />
|
<span asp-validation-for="Input.DBBlockSize" class="text-danger"></span>
|
</div>
|
<div class="col-md-2">
|
<label asp-for="Input.TRegionCount" class="form-label">定时器数量</label>
|
<input asp-for="Input.TRegionCount" class="form-control" type="number" min="0" placeholder="64" />
|
<span asp-validation-for="Input.TRegionCount" class="text-danger"></span>
|
</div>
|
<div class="col-md-2">
|
<label asp-for="Input.CRegionCount" class="form-label">计数器数量</label>
|
<input asp-for="Input.CRegionCount" class="form-control" type="number" min="0" placeholder="64" />
|
<span asp-validation-for="Input.CRegionCount" class="text-danger"></span>
|
</div>
|
</div>
|
|
<hr class="my-4">
|
|
<!-- 提交按钮 -->
|
<div class="d-flex justify-content-between">
|
<a asp-page="/Index" class="btn btn-secondary">
|
<i class="bi bi-x-lg me-1"></i>取消
|
</a>
|
<button type="submit" class="btn btn-primary">
|
<i class="bi bi-check-lg me-1"></i>保存修改
|
</button>
|
</div>
|
</form>
|
</div>
|
</div>
|
|
<!-- 当前状态卡片 -->
|
@if (Model.CurrentInstance != null)
|
{
|
<div class="card mt-4">
|
<div class="card-header">
|
<h6 class="mb-0">
|
<i class="bi bi-activity me-2"></i>当前状态
|
</h6>
|
</div>
|
<div class="card-body">
|
<div class="row">
|
<div class="col-md-4">
|
<strong>状态:</strong>
|
<span class="badge @GetStatusBadgeClass(Model.CurrentInstance.Status)">
|
@GetStatusText(Model.CurrentInstance.Status)
|
</span>
|
</div>
|
<div class="col-md-4">
|
<strong>客户端数:</strong> @Model.CurrentInstance.ClientCount
|
</div>
|
<div class="col-md-4">
|
<strong>总请求数:</strong> @Model.CurrentInstance.TotalRequests
|
</div>
|
</div>
|
</div>
|
</div>
|
}
|
</div>
|
</div>
|
|
@{
|
string GetStatusBadgeClass(WIDESEAWCS_S7Simulator.Core.Enums.InstanceStatus status)
|
{
|
return status switch
|
{
|
WIDESEAWCS_S7Simulator.Core.Enums.InstanceStatus.Running => "bg-success",
|
WIDESEAWCS_S7Simulator.Core.Enums.InstanceStatus.Stopped => "bg-secondary",
|
WIDESEAWCS_S7Simulator.Core.Enums.InstanceStatus.Starting => "bg-info",
|
WIDESEAWCS_S7Simulator.Core.Enums.InstanceStatus.Stopping => "bg-warning",
|
WIDESEAWCS_S7Simulator.Core.Enums.InstanceStatus.Error => "bg-danger",
|
_ => "bg-secondary"
|
};
|
}
|
|
string GetStatusText(WIDESEAWCS_S7Simulator.Core.Enums.InstanceStatus status)
|
{
|
return status switch
|
{
|
WIDESEAWCS_S7Simulator.Core.Enums.InstanceStatus.Running => "运行中",
|
WIDESEAWCS_S7Simulator.Core.Enums.InstanceStatus.Stopped => "已停止",
|
WIDESEAWCS_S7Simulator.Core.Enums.InstanceStatus.Starting => "启动中",
|
WIDESEAWCS_S7Simulator.Core.Enums.InstanceStatus.Stopping => "停止中",
|
WIDESEAWCS_S7Simulator.Core.Enums.InstanceStatus.Error => "错误",
|
_ => status.ToString()
|
};
|
}
|
}
|
|
@section Scripts {
|
@{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
|
|
<script>
|
function resetMemoryConfig() {
|
document.querySelector('#Input_MRegionSize').value = '1024';
|
document.querySelector('#Input_IRegionSize').value = '256';
|
document.querySelector('#Input_QRegionSize').value = '256';
|
document.querySelector('#Input_DBBlockCount').value = '100';
|
document.querySelector('#Input_DBBlockSize').value = '1024';
|
document.querySelector('#Input_TRegionCount').value = '64';
|
document.querySelector('#Input_CRegionCount').value = '64';
|
}
|
</script>
|
}
|