diff --git a/MX-PD-盘古 - new/PanGu.DieBonderApp/.editorconfig b/MX-PD-盘古 - new/PanGu.DieBonderApp/.editorconfig new file mode 100644 index 0000000..56427de --- /dev/null +++ b/MX-PD-盘古 - new/PanGu.DieBonderApp/.editorconfig @@ -0,0 +1,246 @@ +# 如果要从更高级别的目录继承 .editorconfig 设置,请删除以下行 +root = true + +# c# 文件 +[*.cs] + +#### Core EditorConfig 选项 #### + +# 缩进和间距 +indent_size = 4 +indent_style = space +tab_width = 4 + +# 新行首选项 +end_of_line = crlf +insert_final_newline = false + +#### .NET 代码操作 #### + +# 类型成员 +dotnet_hide_advanced_members = false +dotnet_member_insertion_location = with_other_members_of_the_same_kind +dotnet_property_generation_behavior = prefer_throwing_properties + +# 符号搜索 +dotnet_search_reference_assemblies = true + +#### .NET 编码约定 #### + +# 组织 Using +dotnet_separate_import_directive_groups = false +dotnet_sort_system_directives_first = false +file_header_template = unset + +# this. 和 Me. 首选项 +dotnet_style_qualification_for_event = false +dotnet_style_qualification_for_field = false +dotnet_style_qualification_for_method = false +dotnet_style_qualification_for_property = false + +# 语言关键字与 bcl 类型首选项 +dotnet_style_predefined_type_for_locals_parameters_members = true +dotnet_style_predefined_type_for_member_access = true + +# 括号首选项 +dotnet_style_parentheses_in_arithmetic_binary_operators = always_for_clarity +dotnet_style_parentheses_in_other_binary_operators = always_for_clarity +dotnet_style_parentheses_in_other_operators = never_if_unnecessary +dotnet_style_parentheses_in_relational_binary_operators = always_for_clarity + +# 修饰符首选项 +dotnet_style_require_accessibility_modifiers = for_non_interface_members + +# 表达式级首选项 +dotnet_prefer_system_hash_code = true +dotnet_style_coalesce_expression = true +dotnet_style_collection_initializer = true +dotnet_style_explicit_tuple_names = true +dotnet_style_namespace_match_folder = true +dotnet_style_null_propagation = true +dotnet_style_object_initializer = true +dotnet_style_operator_placement_when_wrapping = beginning_of_line +dotnet_style_prefer_auto_properties = true +dotnet_style_prefer_collection_expression = when_types_loosely_match +dotnet_style_prefer_compound_assignment = true +dotnet_style_prefer_conditional_expression_over_assignment = true +dotnet_style_prefer_conditional_expression_over_return = true +dotnet_style_prefer_foreach_explicit_cast_in_source = when_strongly_typed +dotnet_style_prefer_inferred_anonymous_type_member_names = true +dotnet_style_prefer_inferred_tuple_names = true +dotnet_style_prefer_is_null_check_over_reference_equality_method = true +dotnet_style_prefer_simplified_boolean_expressions = true +dotnet_style_prefer_simplified_interpolation = true + +# 字段首选项 +dotnet_style_readonly_field = true + +# 参数首选项 +dotnet_code_quality_unused_parameters = all + +# 禁止显示首选项 +dotnet_remove_unnecessary_suppression_exclusions = none + +# 新行首选项 +dotnet_style_allow_multiple_blank_lines_experimental = true +dotnet_style_allow_statement_immediately_after_block_experimental = true + +#### c# 编码约定 #### + +# var 首选项 +csharp_style_var_elsewhere = false +csharp_style_var_for_built_in_types = false +csharp_style_var_when_type_is_apparent = false + +# Expression-bodied 成员 +csharp_style_expression_bodied_accessors = true +csharp_style_expression_bodied_constructors = false +csharp_style_expression_bodied_indexers = true +csharp_style_expression_bodied_lambdas = true +csharp_style_expression_bodied_local_functions = false +csharp_style_expression_bodied_methods = false +csharp_style_expression_bodied_operators = false +csharp_style_expression_bodied_properties = true + +# 模式匹配首选项 +csharp_style_pattern_matching_over_as_with_null_check = true +csharp_style_pattern_matching_over_is_with_cast_check = true +csharp_style_prefer_extended_property_pattern = true +csharp_style_prefer_not_pattern = true +csharp_style_prefer_pattern_matching = true +csharp_style_prefer_switch_expression = true + +# Null 检查首选项 +csharp_style_conditional_delegate_call = true + +# 修饰符首选项 +csharp_prefer_static_anonymous_function = true +csharp_prefer_static_local_function = true +csharp_preferred_modifier_order = public,private,protected,internal,file,static,extern,new,virtual,abstract,sealed,override,readonly,unsafe,required,volatile,async +csharp_style_prefer_readonly_struct = true +csharp_style_prefer_readonly_struct_member = true + +# 代码块首选项 +csharp_prefer_braces = true +csharp_prefer_simple_using_statement = true +csharp_prefer_system_threading_lock = true +csharp_style_namespace_declarations = block_scoped +csharp_style_prefer_method_group_conversion = true +csharp_style_prefer_primary_constructors = true +csharp_style_prefer_top_level_statements = true + +# 表达式级首选项 +csharp_prefer_simple_default_expression = true +csharp_style_deconstructed_variable_declaration = true +csharp_style_implicit_object_creation_when_type_is_apparent = true +csharp_style_inlined_variable_declaration = true +csharp_style_prefer_implicitly_typed_lambda_expression = true +csharp_style_prefer_index_operator = true +csharp_style_prefer_local_over_anonymous_function = true +csharp_style_prefer_null_check_over_type_check = true +csharp_style_prefer_range_operator = true +csharp_style_prefer_tuple_swap = true +csharp_style_prefer_unbound_generic_type_in_nameof = true +csharp_style_prefer_utf8_string_literals = true +csharp_style_throw_expression = true +csharp_style_unused_value_assignment_preference = discard_variable +csharp_style_unused_value_expression_statement_preference = discard_variable + +# "using" 指令首选项 +csharp_using_directive_placement = outside_namespace + +# 新行首选项 +csharp_style_allow_blank_line_after_colon_in_constructor_initializer_experimental = true +csharp_style_allow_blank_line_after_token_in_arrow_expression_clause_experimental = true +csharp_style_allow_blank_line_after_token_in_conditional_expression_experimental = true +csharp_style_allow_blank_lines_between_consecutive_braces_experimental = true +csharp_style_allow_embedded_statements_on_same_line_experimental = true + +#### C# 格式规则 #### + +# 新行首选项 +csharp_new_line_before_catch = true +csharp_new_line_before_else = true +csharp_new_line_before_finally = true +csharp_new_line_before_members_in_anonymous_types = true +csharp_new_line_before_members_in_object_initializers = true +csharp_new_line_before_open_brace = all +csharp_new_line_between_query_expression_clauses = true + +# 缩进首选项 +csharp_indent_block_contents = true +csharp_indent_braces = false +csharp_indent_case_contents = true +csharp_indent_case_contents_when_block = true +csharp_indent_labels = one_less_than_current +csharp_indent_switch_labels = true + +# 空格键首选项 +csharp_space_after_cast = false +csharp_space_after_colon_in_inheritance_clause = true +csharp_space_after_comma = true +csharp_space_after_dot = false +csharp_space_after_keywords_in_control_flow_statements = true +csharp_space_after_semicolon_in_for_statement = true +csharp_space_around_binary_operators = before_and_after +csharp_space_around_declaration_statements = false +csharp_space_before_colon_in_inheritance_clause = true +csharp_space_before_comma = false +csharp_space_before_dot = false +csharp_space_before_open_square_brackets = false +csharp_space_before_semicolon_in_for_statement = false +csharp_space_between_empty_square_brackets = false +csharp_space_between_method_call_empty_parameter_list_parentheses = false +csharp_space_between_method_call_name_and_opening_parenthesis = false +csharp_space_between_method_call_parameter_list_parentheses = false +csharp_space_between_method_declaration_empty_parameter_list_parentheses = false +csharp_space_between_method_declaration_name_and_open_parenthesis = false +csharp_space_between_method_declaration_parameter_list_parentheses = false +csharp_space_between_parentheses = false +csharp_space_between_square_brackets = false + +# 包装首选项 +csharp_preserve_single_line_blocks = true +csharp_preserve_single_line_statements = true + +#### 命名样式 #### + +# 命名规则 + +dotnet_naming_rule.interface_should_be_begins_with_i.severity = suggestion +dotnet_naming_rule.interface_should_be_begins_with_i.symbols = interface +dotnet_naming_rule.interface_should_be_begins_with_i.style = begins_with_i + +dotnet_naming_rule.types_should_be_pascal_case.severity = suggestion +dotnet_naming_rule.types_should_be_pascal_case.symbols = types +dotnet_naming_rule.types_should_be_pascal_case.style = pascal_case + +dotnet_naming_rule.non_field_members_should_be_pascal_case.severity = suggestion +dotnet_naming_rule.non_field_members_should_be_pascal_case.symbols = non_field_members +dotnet_naming_rule.non_field_members_should_be_pascal_case.style = pascal_case + +# 符号规范 + +dotnet_naming_symbols.interface.applicable_kinds = interface +dotnet_naming_symbols.interface.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected +dotnet_naming_symbols.interface.required_modifiers = + +dotnet_naming_symbols.types.applicable_kinds = class, struct, interface, enum +dotnet_naming_symbols.types.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected +dotnet_naming_symbols.types.required_modifiers = + +dotnet_naming_symbols.non_field_members.applicable_kinds = property, event, method +dotnet_naming_symbols.non_field_members.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected +dotnet_naming_symbols.non_field_members.required_modifiers = + +# 命名样式 + +dotnet_naming_style.pascal_case.required_prefix = +dotnet_naming_style.pascal_case.required_suffix = +dotnet_naming_style.pascal_case.word_separator = +dotnet_naming_style.pascal_case.capitalization = pascal_case + +dotnet_naming_style.begins_with_i.required_prefix = I +dotnet_naming_style.begins_with_i.required_suffix = +dotnet_naming_style.begins_with_i.word_separator = +dotnet_naming_style.begins_with_i.capitalization = pascal_case diff --git a/MX-PD-盘古 - new/PanGu.DieBonderApp/.github/instructions/csharp-base.instructions.md b/MX-PD-盘古 - new/PanGu.DieBonderApp/.github/instructions/csharp-base.instructions.md new file mode 100644 index 0000000..d4d1d35 --- /dev/null +++ b/MX-PD-盘古 - new/PanGu.DieBonderApp/.github/instructions/csharp-base.instructions.md @@ -0,0 +1,106 @@ +--- +applyTo: "**/*.cs" +--- + +# C# Base Instructions + +## Language Version Constraint +This repository targets .NET Framework 4.8 and C# 7.3. + +Do not use: +- record +- init property setters +- switch expressions +- using declarations +- top-level statements +- nullable reference types +- range operators (`..`) +- default interface implementations +- IAsyncEnumerable + +Allowed: +- async/await +- pattern matching with is / switch case patterns +- tuples +- local functions +- inline out variable declarations +- throw expressions +- ref locals and ref returns + +## ˵ +ĿĿΪ .NET Framework 4.8C# 汾̶Ϊ 7.3 +ˣ +- ֹʹ recordinitswitch ʽusing ɿ͵ C# 8+ +- ʹ async/awaitԪ顢غģʽƥ䡢 out C# 7.3 ֵ֧Ĺ + +## Style Rules +- Use explicit types, not `var` +- Use Allman braces +- Use 4 spaces indentation +- Use CRLF line endings +- Use block-scoped namespaces +- Place using directives outside namespaces + +## ˵ +Ҫ +- ʽͣʹ `var` +- ʹ Allman ŷ +- 4 ո +- ʹ CRLF +- ʹÿռ +- using ռ + +## Naming Rules +- Public types, methods, properties, events: PascalCase +- Private fields: _camelCase +- Constants: PascalCase +- Interfaces: I + PascalCase +- Enums: PascalCase + +## ˵ +淶 +- ͡ԡ¼PascalCase +- ˽ֶΣ`_camelCase` +- PascalCase +- ӿڣ`I` + PascalCase +- ö٣PascalCase + +## Constructor Injection +Prefer constructor injection with null checks. + +Example: +```csharp +public SafeAxisMotion(HardwareManager hardware, AlarmOperate alarmOperate) +{ + _hardware = hardware ?? throw new ArgumentNullException(nameof(hardware)); + _alarmOperate = alarmOperate ?? throw new ArgumentNullException(nameof(alarmOperate)); +} +``` + +## ˵ +עʹù캯ע룬Բ null 顣 +Ҫʡ null + +## Async Rules +Async methods must use Async suffix +Pass CancellationToken where appropriate +Do not block async code with .Result or .Wait() unless existing architecture requires it and the reason is explicit + +## ˵ +첽 +- 첽 Async ׺ +- Ҫ֧ȡij봫 CancellationToken +- Ҫʹ .Result .Wait() 첽ãмܹȷҪ + +## Code Generation Preference +Keep methods focused and readable +Prefer explicit domain terminology over generic names +Avoid unnecessary abstractions +Match the existing repository style + +## ˵ +ɴʱ +- ְַ +- ʹȷ +- ⲻҪij +- вֿ diff --git a/MX-PD-盘古 - new/PanGu.DieBonderApp/.github/instructions/hardware-io.instructions.md b/MX-PD-盘古 - new/PanGu.DieBonderApp/.github/instructions/hardware-io.instructions.md new file mode 100644 index 0000000..3b057ac --- /dev/null +++ b/MX-PD-盘古 - new/PanGu.DieBonderApp/.github/instructions/hardware-io.instructions.md @@ -0,0 +1,68 @@ +--- +applyTo: "MainShell/Hardware/**/*.cs,MainShell/DeviceMaintance/**/*.cs,MainShell/Manual/**/*.cs,MainShell/ToolBox/**/*.cs" +--- + +# Hardware and IO Instructions + +## Hardware Access Rules +- Reuse HardwareManager as the primary hardware entry point +- Do not invent parallel hardware access layers unless explicitly requested +- Keep hardware naming and organization consistent with existing project patterns + +## ˵ +Ӳʹ +- ͳһͨ `HardwareManager` ΪҪӲ +- Ҫƽ½һӲʲ +- Ӳ֯ʽĿһ + +## Axis Naming Rules +All axis names should be defined as constants in the existing axis naming class. + +Naming pattern: +- Axis_ prefix +- Examples: + - Axis_SZ + - Axis_PHS_X1 + - Axis_WS_X3 + - Axis_Stage_Y3 + +If a new axis is introduced, define a constant in the existing axis name holder. + +## ˵ + +- ӦΪ +- ͳһʹ `Axis_` ǰ׺ +- ᣬ벹䳣壬ҪҵӲַ + +## IO Rules +- IO point definitions are loaded from CSV configuration +- Reuse DeviceIoPointDefinition and existing IO grouping structures +- Preserve support for simulated IO states if relevant +- Keep IO service/model/event naming device-oriented + +Use: +- DeviceIoMonitorService +- DeviceIoSnapshot +- DeviceCylinderService + +Avoid logistics-specific names unless the domain explicitly requires them: +- ConveyorIoService +- LoaderIoMonitor + +## ˵ +IO +- IO 㶨ͨ CSV ü +- `DeviceIoPointDefinition` IO ṹ +- ģ IO ״̬ƣӦּ +- IO Ҫ豸ҪʹùҵȷҪ + +## Safety Preference +- Validate device state before critical actions +- Do not assume hardware is ready +- Keep generated code conservative and traceable + +## ˵ +ȫԭ +- ؼ豸ǰУ豸״̬ +- ҪĬӲѾ ready +- ɴʱҪƫء׷ diff --git a/MX-PD-盘古 - new/PanGu.DieBonderApp/.github/instructions/localization-popup.instructions.md b/MX-PD-盘古 - new/PanGu.DieBonderApp/.github/instructions/localization-popup.instructions.md new file mode 100644 index 0000000..5ef2ebd --- /dev/null +++ b/MX-PD-盘古 - new/PanGu.DieBonderApp/.github/instructions/localization-popup.instructions.md @@ -0,0 +1,161 @@ +--- +applyTo: "MainShell/Common/**/*.cs,**/*ViewModel.cs,**/*Service.cs,**/*Process*.cs" +--- + +# Localization and Popup Instructions + +## Scope +These rules apply to internal program message dialogs only. + +Do not apply these rules to: +- database alarms +- PLC alarm chain +- device alarm chain +- AlarmAsync main alarm path + +## ˵ +Щ**ڲʾ** +ڣ +- ݿⱨ +- PLC · +- 豸· +- `AlarmAsync()` · + +## Required Popup Pattern +For internal prompts: +1. define MessageKey enum value in `MainShell/Common/MessageKey.cs` +2. add mapping in `LanguageResourceHelper.ResourceKeyMap` +3. add Chinese resource in `MainShell/Language/MXJM_CN.xaml` +4. add English resource in `MainShell/Language/MXJM_EN.xaml` +5. call `LocalizedMessageBox.Show()` or `LocalizedMessageBox.ShowFormat()` + +## ˵ +ʾ̣ +1. `MessageKey.cs` жö +2. `LanguageResourceHelper.ResourceKeyMap` ӳ +3. `MXJM_CN.xaml` вԴ +4. `MXJM_EN.xaml` вӢԴ +5. ҵͳһ `LocalizedMessageBox.Show()` `ShowFormat()` + +## Required Title Keys +Use: +- MessageKey.TitleInfo +- MessageKey.TitleWarning +- MessageKey.TitleError +- MessageKey.TitleConfirm + +## ˵ +ͳһʹã +- `MessageKey.TitleInfo` +- `MessageKey.TitleWarning` +- `MessageKey.TitleError` +- `MessageKey.TitleConfirm` + +## Formatting Rules +- For parameterized messages, use `ShowFormat()` +- Resource text should use placeholders such as `{0}`, `{1}` + +## ˵ +ʾİʹ `ShowFormat()`Դıʹ `{0}``{1}` ռλ + +## Forbidden Patterns +Do not generate: +- `MwMessageBox.Show("")` +- `MessageBox.Show("")` +- `LocalizedMessageBox.Show("resourceKeyString")` +- direct resource dictionary access for popup text + +## ˵ +ֹд +- `MwMessageBox.Show("")` +- `MessageBox.Show("")` +- `LocalizedMessageBox.Show("Դkeyַ")` +- ֱӷԴֵȡİ + +## Migration Rule +When modifying old internal prompt code, prefer migrating old MessageBox/MwMessageBox usage to LocalizedMessageBox and update: +- MessageKey enum +- ResourceKeyMap +- Chinese resource +- English resource +- business code call site + +## ˵ +ǨƾɴеijʾʱӦȸΪ `LocalizedMessageBox` ͬ룺 +- MessageKey ö +- ResourceKeyMap ӳ +- Դ +- ӢԴ +- ҵõ + +## Workflow / Process Error and Message Localization +Error messages, status messages, and user-facing messages generated in: +- Service layer (Service/*Service.cs) +- Activity layer (MainShell/Process/Activity/*.cs) +- ProcessService implementations + +Must follow the same localization requirements as popup dialogs: +1. Define MessageKey enum values for all error/status messages +2. Register in LanguageResourceHelper.ResourceKeyMap +3. Add translations in MXJM_CN.xaml and MXJM_EN.xaml +4. Pass MessageKey enum (not raw strings) in WorkflowContext or result objects +5. Display messages using LocalizedMessageBox from ViewModel/View layer + +Do not hardcode error messages or status strings in Service/Activity code. + +## ˵ +λɵĴϢ״̬ʾûʾ +- Service 㣨Service/*Service.cs +- Activity 㣨MainShell/Process/Activity/*.cs +- ProcessService ʵ + +ѭ뵯ͬıػ淶 +1. MessageKey жд/״̬Ϣöֵ +2. LanguageResourceHelper.ResourceKeyMap ע +3. MXJM_CN.xaml MXJM_EN.xaml ӶӦ +4. WorkflowContext д MessageKey öֵԭʼַ +5. ViewModel/View ʹ LocalizedMessageBox ʾϢ + + Service/Activity ӲϢ״ַ̬ + +## Example: Adding Workflow Error Message +For a new workflow error in a Service: + +1. Define in `MessageKey.cs`: + ```csharp + ProcessError_InvalidToolId, + ProcessError_HardwareTimeout, + ``` + +2. Add to `LanguageResourceHelper.ResourceKeyMap`: + ```csharp + { MessageKey.ProcessError_InvalidToolId, + "MXJM:ProcessError_InvalidToolId" }, + { MessageKey.ProcessError_HardwareTimeout, + "MXJM:ProcessError_HardwareTimeout" }, + ``` + +3. In result object, return the message key: + ```csharp + public MessageKey? ErrorMessageKey { get; set; } + ``` + +4. In Activity's AfterExecute or ViewModel, check and display: + ```csharp + if (result.ErrorMessageKey.HasValue) + { + LocalizedMessageBox.Show(result.ErrorMessageKey.Value, + MessageKey.TitleError); + } + ``` + +## ˵ +ԹΪ + +1. `MessageKey.cs` ж壺 + ProcessError_InvalidToolId + ProcessError_HardwareTimeout + +2. `LanguageResourceHelper.ResourceKeyMap` ע +3. Service ضа MessageKey +4. Activity AfterExecute ViewModel м鲢ʹ LocalizedMessageBox ʾ diff --git a/MX-PD-盘古 - new/PanGu.DieBonderApp/.github/instructions/motion.instructions.md b/MX-PD-盘古 - new/PanGu.DieBonderApp/.github/instructions/motion.instructions.md new file mode 100644 index 0000000..4cf97df --- /dev/null +++ b/MX-PD-盘古 - new/PanGu.DieBonderApp/.github/instructions/motion.instructions.md @@ -0,0 +1,104 @@ +--- +applyTo: "MainShell/Motion/**/*.cs,**/*MotionController*.cs,**/*SafeAxisMotion*.cs,**/*AxisSpeedManager*.cs" +--- + +# Motion Control Instructions + +## Motion Architecture +Motion control uses layered design: + +- SafeAxisMotion as business entry +- MotionController as single-axis controller +- IAxis / IAxisFunc as platform abstraction + +Keep this layering intact. + +## ˵ +˶Ʋù̶ֲ㣺 +- `SafeAxisMotion`ҵ +- `MotionController` +- `IAxis / IAxisFunc`ƽ̨ӿ + +Ҫƻзֲϵ + +## MotionController Rules +- Constructor should receive `IAxis` +- Convert to `IAxisFunc` when motion command capability is needed +- Use `SemaphoreSlim` to serialize motion commands per axis +- Motion methods should support async/await and CancellationToken +- Perform status validation before motion: + - servo/power status + - alarm status + - soft limit state +- Support timeout handling +- Raise motion lifecycle events such as MotionStarted / MotionFinished + +## ˵ +`MotionController` ƹ +- 캯 `IAxis` +- Ҫ˶ʱתΪ `IAxisFunc` +- ʹ `SemaphoreSlim` ָ֤ +- ˶֧ `async/await` `CancellationToken` +- ˶ǰҪŷ״̬״̬λ״̬ +- ֳ֧ʱ +- ṩ `MotionStarted` / `MotionFinished` ¼ + +## Common Axis Properties +Prefer existing property patterns such as: +- AxisName +- CurrentPos +- IsBusy +- IsAlarm +- InPos + +## ˵ +Աģʽһ£磺 +- `AxisName` +- `CurrentPos` +- `IsBusy` +- `IsAlarm` +- `InPos` + +## Motion Method Signatures +Keep compatibility with existing motion API patterns: +- MoveAbsAsync +- MoveRelAsync +- JogAsync +- StopAsync +- HomeAsync + +## ˵ +˶ǩݣ +- `MoveAbsAsync` +- `MoveRelAsync` +- `JogAsync` +- `StopAsync` +- `HomeAsync` + +## SafeAxisMotion Rules +- Prefer SafeAxisMotion for batch-safe movement +- Resolve axis name to IAxis and MotionController through existing repository mechanisms +- Preserve alarm integration and timeout behavior + +## ˵ +ȫƶͨ `SafeAxisMotion` ʵ֣ +- ͨлưΪ `IAxis` `MotionController` +- ɺͳʱ + +## MotionResult Rules +- Use structured MotionResult +- Distinguish success, timeout, cancellation, and fault +- Use EnsureSuccess when caller expects exception-on-failure semantics + +## ˵ +`MotionResult` ӦΪṹ +- ֳɹʱȡ쳣 +- ÷Ҫ"ʧܼ쳣"ʱʹ `EnsureSuccess()` + +## Speed Management +Use AxisSpeedManager for speed control where applicable. +Do not hardcode inconsistent speed logic if a unified speed manager already exists. + +## ˵ +ٶȹͨ `AxisSpeedManager` ͳһ +ͳһٶȹҪ´Ӳһٶ߼ diff --git a/MX-PD-盘古 - new/PanGu.DieBonderApp/.github/instructions/recipe-and-logging.instructions.md b/MX-PD-盘古 - new/PanGu.DieBonderApp/.github/instructions/recipe-and-logging.instructions.md new file mode 100644 index 0000000..5d94b14 --- /dev/null +++ b/MX-PD-盘古 - new/PanGu.DieBonderApp/.github/instructions/recipe-and-logging.instructions.md @@ -0,0 +1,92 @@ +--- +applyTo: "MainShell/Recipe/**/*.cs,MainShell/Parameter/**/*.cs,MainShell/Log/**/*.cs,MainShell/Filewritable/**/*.cs,MainShell/Process/**/*.cs" +--- + +# Recipe, Persistence, and Logging Instructions + +## Recipe System +Recipe hierarchy includes: +- IRecipe +- RecipeBase +- SubstrateRecipe +- WaferRecipe +- CarrierRecipe +- ProcessRecipe + +Use existing recipe abstractions and managers: +- RecipeManager +- RecipeWrapManager + +Do not bypass repository recipe patterns by creating incompatible configuration systems. + +## ˵ +䷽ϵͳѭв㼶 +- `IRecipe` +- `RecipeBase` +- `SubstrateRecipe` +- `WaferRecipe` +- `CarrierRecipe` +- `ProcessRecipe` + +Ӧȸã +- `RecipeManager` +- `RecipeWrapManager` + +Ҫƿ䷽ϵ½һײݵϵͳ + +## Parameter and Process Input Rules +- Prefer reading process inputs from recipe objects and formal managers +- Do not pull process parameters from UI state when repository recipe/domain objects already exist +- Keep process input sources explicit and traceable + +## ˵ + +- ȴ䷽ʽжȡ +- ʽ󣬲Ҫ UI ״̬ȡ̲ +- ԴҪȷ׷ + +## File Persistence Rules +Persistence follows: +- IFileWritable +- FileWriteBase +- JsonFileWritableBase + +Use: +- FileWriteQueue for async queued file writes +- Newtonsoft.Json for JSON serialization + +Reuse IgnorePropertiesResolver when selective serialization is needed. + +## ˵ +ļ־ûѭмܹ +- `IFileWritable` +- `FileWriteBase` +- `JsonFileWritableBase` + +Ӧʹã +- `FileWriteQueue` 첽дй +- `Newtonsoft.Json` JSON л +- Ҫѡлʱ `IgnorePropertiesResolver` + +## Logging Rules +- Use `LogNameDefine` for log names +- Use `LogManager` for unified log management +- Keep logs consistent with existing MaxWellGeneralLog usage + +## ˵ +־ +- ־ͳһ `LogNameDefine` ж +- ͨ `LogManager` ͳһ +- `MaxWellGeneralLog` ÷һ + +## Logging Expectations +Generated code should: +- log major workflow and hardware steps +- log failures with enough context +- preserve traceability for production and troubleshooting + +## ˵ +ɴʱ־Ӧ㣺 +- ؼ̲Ӳ־ +- ʧ־㹻 +- ֧׷ݺֳ diff --git a/MX-PD-盘古 - new/PanGu.DieBonderApp/.github/instructions/workflow.instructions.md b/MX-PD-盘古 - new/PanGu.DieBonderApp/.github/instructions/workflow.instructions.md new file mode 100644 index 0000000..fac98a4 --- /dev/null +++ b/MX-PD-盘古 - new/PanGu.DieBonderApp/.github/instructions/workflow.instructions.md @@ -0,0 +1,105 @@ +--- +applyTo: "MainShell/Process/**/*.cs,**/*Activity.cs,**/*Workflow*.cs,**/*ProcessService.cs,**/*MotionService.cs" +--- + +# Workflow Instructions + +## Workflow Architecture +This repository uses: +- WorkflowRunner +- AutoProductionWorkflowBuilder +- ActivityAbstractBase +- CompositeActivity +- WorkflowStepIds +- WorkflowStepIdResolver + +## ˵ +ϵͳ Workflow ܹʵ֣ɴʱӦȸЩͻơ + +## Layering Rules +- Activity layer only: + - calls Service / MotionService / ProcessService + - writes WorkflowContext + - returns execution result +- PrepareExecute and AfterExecute only handle pre/post processing +- Core workflow logic must be implemented in Service layer +- Do not place recipe parsing, compensation logic, vision logic, or hardware orchestration in Activity + +## ˵ +ֲ +- Activity ֻ Serviceд WorkflowContextִн +- `PrepareExecute` `AfterExecute` ֻǰ +- ߼ Service +- Ҫ Activity д䷽Ӿ㷨߼Ӳ + +## Routing Rules +- Do not place workflow jump logic in Activity +- Actual workflow transitions must be configured by WorkflowStep +- Normal business branches should use Route / SetRoute +- Failure should only be used for real failures: + - hardware error + - timeout + - communication failure + - invalid required input + - unrecoverable process error + +## ˵ +ת +- Ҫ Activity дת߼ +- תͳһ WorkflowStep +- ҵ֧ʹ `Route / SetRoute` +- `Failure` ֻ쳣Ӳ󡢳ʱͨѶʧܡؼȱʧɻָ + +## JumpConditions Rules +- JumpConditions are matched in add order +- More specific branches must be placed first +- Default flow must be placed last + +## ˵ +`JumpConditions` ƥ˳˳ִУ +- ǰ +- ĬϷ֧ + +## Service Responsibilities +Service layer should be responsible for: +- reading WorkflowContext +- reading RecipeManager and current recipe +- reading teach data and process parameters +- acquiring hardware via HardwareManager +- validating inputs +- validating hardware state +- validating safety conditions +- executing workflow core steps +- computing business result or compensation result +- determining Route +- returning structured process result + +## ˵ +Service ְ +- ȡ `WorkflowContext` +- ȡ `RecipeManager` ͵ǰ䷽ +- ȡʾݺ͹ղ +- ͨ `HardwareManager` ȡӲ +- У롢Ӳ״̬Ͱȫ +- ִк̲ +- ҵ򲹳 +- `Route` +- ؽṹ + +## Output Preference +When implementing workflow code, prefer: +1. Activity skeleton +2. Service skeleton +3. result object design +4. WorkflowContext write-back fields +5. WorkflowStep routing suggestion +6. JumpConditions ordering suggestion + +## ˵ +ʵ̴ʱ +1. Activity Ǽ +2. Service Ǽ +3. +4. WorkflowContext дֶ +5. WorkflowStep ·ɽ +6. JumpConditions ˳ diff --git a/MX-PD-盘古 - new/PanGu.DieBonderApp/.github/instructions/wpf-mvvm.instructions.md b/MX-PD-盘古 - new/PanGu.DieBonderApp/.github/instructions/wpf-mvvm.instructions.md new file mode 100644 index 0000000..42deeff --- /dev/null +++ b/MX-PD-盘古 - new/PanGu.DieBonderApp/.github/instructions/wpf-mvvm.instructions.md @@ -0,0 +1,72 @@ +--- +applyTo: "**/*ViewModel.cs,**/*.xaml,MainShell/Converter/**/*.cs,MainShell/Home/**/*.cs,MainShell/ParaSetting/**/*.cs,MainShell/DeviceMaintance/**/*.cs,MainShell/PageCalib/**/*.cs,MainShell/Manual/**/*.cs" +--- + +# WPF and MVVM Instructions + +## Framework +This repository uses WPF with Stylet. + +## ˵ +Ŀ WPF ʹ StyletMVVM شѭ Stylet Լ + +## ViewModel Rules +- ViewModel classes should inherit from `Screen` or `PropertyChangedBase` +- Follow Stylet naming convention: + - XxxView ? XxxViewModel +- Do not introduce patterns that conflict with Stylet conventions + +## ˵ +ViewModel +- ViewModel ̳ `Screen` `PropertyChangedBase` +- View ViewModel ԼԶ +- Ҫ Stylet ͻ MVVM ģʽ + +## State Management +- Prefer bindable state objects to hold UI state +- Do not scatter many unrelated primitive bindable properties if a cohesive state model is more suitable +- Distinguish device input state and output state clearly + +## ˵ +״̬飺 +- ʹÿɰ״̬ͳһؽ״̬ +- Աһ״̬򣬲Ҫɢ ViewModel +- ״̬״̬Ҫȷ + +## IoC Rules +- IoC registrations belong in `StartBootstrapper.ConfigureIoC()` +- Singleton services should use `[Singleton]` or be registered as singleton in IoC +- New services must be registered consistently with existing project patterns + +## ˵ +IoC +- IoC עͳһ `StartBootstrapper.ConfigureIoC()` +- ͨ `[Singleton]` ע +- ѭע + +## XAML Rules +- Do not manually implement `InitializeComponent` +- Do not work around WPF compilation issues by writing manual code-behind loaders +- Fix page compilation through project file and proper WPF item setup +- Value converters should be placed in `Converter/` and named `XxxConverter` + +## ˵ +XAML +- Ҫд `InitializeComponent` +- Ҫͨ code-behind ֹҳƹ +- ҳӦͨ csproj WPF ޸ +- ת `Converter/` £ʹ `XxxConverter` + +## Language Resource Rules +Project language resources are loaded from: +- `Language/MaxwellFramework_{lang}.xaml` +- `Language/MXJM_{lang}.xaml` + +Keep generated UI code compatible with the existing localization mechanism. + +## ˵ +Դѭлƣ +- ƽ̨԰`MaxwellFramework_{lang}.xaml` +- Ŀ԰`MXJM_{lang}.xaml` + + UI ʱҪƻжԻơ diff --git a/MX-PD-盘古 - new/PanGu.DieBonderApp/Configuration/AxisCardPO.xml b/MX-PD-盘古 - new/PanGu.DieBonderApp/Configuration/AxisCardPO.xml new file mode 100644 index 0000000..772d435 --- /dev/null +++ b/MX-PD-盘古 - new/PanGu.DieBonderApp/Configuration/AxisCardPO.xml @@ -0,0 +1,581 @@ + + + + 0 + AcsCard + 2d23c400-ccf2-469a-add5-ae92a98a85e6 + false + AxisCardPO.xml + DEMO + 0 + 0 + + + 0 + PHS-X1 + 3a9c772b-4a9c-4077-abbc-80fc038b81ee + false + AxisCardParaPO.xml + 0 + AcsCard + 0 + 0 + PHS-X1 + X + 0 + 0 + 0 + 0 + 0 + HOME_MODE_ERROR + false + 0.001 + + + 0 + PHS-X2 + c83e5f81-ef2c-413c-ace9-24bc97c30b32 + false + AxisCardParaPO.xml + 0 + AcsCard + 0 + 1 + PHS-X2 + X + 0 + 0 + 0 + 0 + 0 + HOME_MODE_ERROR + false + 0.001 + + + 0 + WS-X3 + e0a2d6ed-2972-4595-a8dc-53a504187a9f + false + AxisCardParaPO.xml + 0 + AcsCard + 0 + 4 + WS-X3 + X + 0 + 0 + 0 + 0 + 0 + HOME_MODE_ERROR + false + 0.001 + + + 0 + PHS-Y1 + 4e145d2a-f7f7-4ce2-a5b0-919375a03d87 + false + AxisCardParaPO.xml + 0 + AcsCard + 0 + 2 + PHS-Y1 + X + 0 + 0 + 0 + 0 + 0 + HOME_MODE_ERROR + false + 0.001 + + + 0 + WS-R + cebe7f5c-8cdd-47e8-906a-6083047a078d + false + AxisCardParaPO.xml + 0 + AcsCard + 0 + 6 + WS-R + X + 0 + 0 + 0 + 0 + 0 + HOME_MODE_ERROR + false + 0.001 + + + 0 + SZ + ce1f8f65-3409-4124-9c9a-ba750c848e36 + false + AxisCardParaPO.xml + 0 + AcsCard + 0 + 8 + SZ + X + 0 + 0 + 0 + 0 + 0 + HOME_MODE_ERROR + false + 0.001 + + + 0 + Stage-Y3 + 05dfa6d1-401b-4a55-808b-5af2efeb358c + false + AxisCardParaPO.xml + 0 + AcsCard + 0 + 7 + Stage-Y3 + X + 0 + 0 + 0 + 0 + 0 + HOME_MODE_ERROR + false + 0.001 + + + 1 + 0 + 0 + false + + + 0 + Plc + 80a2e320-d4da-46a6-9f35-0a6d0996ea22 + false + AxisCardPO.xml + DEMO + 0 + 0 + + + 0 + PHS-Z1 + 471e0395-0918-4e0b-b9cb-d0727281ef6c + false + AxisCardParaPO.xml + 0 + Plc + 0 + 0 + PHS-Z1 + Z + 0 + 0 + 0 + 0 + 0 + HOME_MODE_ERROR + false + 0.001 + + + 0 + PHS-Z3 + 5dd115ab-09a4-4bbb-9fdf-e9b76cc5e88e + false + AxisCardParaPO.xml + 0 + Plc + 0 + 1 + PHS-Z3 + Z + 0 + 0 + 0 + 0 + 0 + HOME_MODE_ERROR + false + 0.001 + + + 0 + PHS-Z4 + e359bc21-c1e8-4e06-acdb-1df94ee7931b + false + AxisCardParaPO.xml + 0 + Plc + 0 + 10 + PHS-Z4 + X + 0 + 0 + 0 + 0 + 0 + HOME_MODE_ERROR + false + 0.001 + + + 0 + PHS-Z5 + 9d948211-59ae-498c-b124-531a69855752 + false + AxisCardParaPO.xml + 0 + Plc + 0 + 2 + PHS-Z5 + X + 0 + 0 + 0 + 0 + 0 + HOME_MODE_ERROR + false + 0.001 + + + 0 + PHS-Z6 + 477c569a-e460-4c45-917f-a0744ebed5ec + false + AxisCardParaPO.xml + 0 + Plc + 0 + 11 + PHS-Z6 + X + 0 + 0 + 0 + 0 + 0 + HOME_MODE_ERROR + false + 0.001 + + + 0 + Stage-Z7 + f761791c-8fb4-4a5b-8fef-0380e996e81f + false + AxisCardParaPO.xml + 0 + Plc + 0 + 7 + Stage-Z7 + X + 0 + 0 + 0 + 0 + 0 + HOME_MODE_ERROR + false + 0.001 + + + 0 + Stage-Z8 + 28a1caa3-01bc-48ed-8551-68829b280a6f + false + AxisCardParaPO.xml + 0 + Plc + 0 + 8 + Stage-Z8 + X + 0 + 0 + 0 + 0 + 0 + HOME_MODE_ERROR + false + 0.001 + + + 0 + Stage-Z9 + 71c8587a-1e85-4fa4-8809-14f00111a230 + false + AxisCardParaPO.xml + 0 + Plc + 0 + 9 + Stage-Z9 + X + 0 + 0 + 0 + 0 + 0 + HOME_MODE_ERROR + false + 0.001 + + + 0 + Stage-Z10 + fc66c8d2-c35f-46b5-9c14-f3a017311e86 + false + AxisCardParaPO.xml + 0 + Plc + 0 + 14 + Stage-Z10 + X + 0 + 0 + 0 + 0 + 0 + HOME_MODE_ERROR + false + 0.001 + + + 0 + Stage-CV-Y4 + 6ebf862a-c91e-4bb2-a5b7-e67f307333b4 + false + AxisCardParaPO.xml + 0 + Plc + 0 + 15 + Stage-CV-Y4 + X + 0 + 0 + 0 + 0 + 0 + HOME_MODE_ERROR + false + 0.001 + + + 0 + Stage-CV-Y5 + e1cf2e06-fe51-4115-8ad2-2a0b3dc53c00 + false + AxisCardParaPO.xml + 0 + Plc + 0 + 16 + Stage-CV-Y5 + X + 0 + 0 + 0 + 0 + 0 + HOME_MODE_ERROR + false + 0.001 + + + 0 + WEU-Z11 + a765e366-03a3-451f-ab44-1e6129a6ac61 + false + AxisCardParaPO.xml + 0 + Plc + 0 + 3 + WEU-Z11 + X + 0 + 0 + 0 + 0 + 0 + HOME_MODE_ERROR + false + 0.001 + + + 0 + WEU-Z12 + a4c43082-6841-45b4-83f2-b89a952a6547 + false + AxisCardParaPO.xml + 0 + Plc + 0 + 4 + WEU-Z12 + X + 0 + 0 + 0 + 0 + 0 + HOME_MODE_ERROR + false + 0.001 + + + 0 + WEU-Y6 + 670409e3-1e19-45c8-94b8-1f3fb1905dc2 + false + AxisCardParaPO.xml + 0 + Plc + 0 + 5 + WEU-Y6 + X + 0 + 0 + 0 + 0 + 0 + HOME_MODE_ERROR + false + 0.001 + + + 0 + CV-Z13 + eb009565-40bf-4923-9b9b-fdf483dc1532 + false + AxisCardParaPO.xml + 0 + Plc + 0 + 6 + CV-Z13 + X + 0 + 0 + 0 + 0 + 0 + HOME_MODE_ERROR + false + 0.001 + + + 0 + CV-Y7 + d75ee50a-ba99-4ec1-bb36-6e65cbd84180 + false + AxisCardParaPO.xml + 0 + Plc + 0 + 18 + CV-Y7 + X + 0 + 0 + 0 + 0 + 0 + HOME_MODE_ERROR + false + 0.001 + + + 0 + CV-Y8 + 8845c4e8-4d09-4f0a-b073-1b29e1ca59e6 + false + AxisCardParaPO.xml + 0 + Plc + 0 + 19 + CV-Y8 + X + 0 + 0 + 0 + 0 + 0 + HOME_MODE_ERROR + false + 0.001 + + + 0 + CV-Y9 + 4970be79-b46a-4004-84bf-82e922fb5cb8 + false + AxisCardParaPO.xml + 0 + Plc + 0 + 20 + CV-Y9 + X + 0 + 0 + 0 + 0 + 0 + HOME_MODE_ERROR + false + 0.001 + + + 0 + CV-Y10 + 36583278-40bd-48ad-a749-02b4e58dcbca + false + AxisCardParaPO.xml + 0 + Plc + 0 + 21 + CV-Y10 + X + 0 + 0 + 0 + 0 + 0 + HOME_MODE_ERROR + false + 0.001 + + + 1 + 0 + 0 + false + + \ No newline at end of file diff --git a/MX-PD-盘古 - new/PanGu.DieBonderApp/Configuration/CylinderDefinitions.csv b/MX-PD-盘古 - new/PanGu.DieBonderApp/Configuration/CylinderDefinitions.csv new file mode 100644 index 0000000..a2aa13c --- /dev/null +++ b/MX-PD-盘古 - new/PanGu.DieBonderApp/Configuration/CylinderDefinitions.csv @@ -0,0 +1,9 @@ +# 气缸定义表 +# 列顺序:Name,Module,ControlType,ExtendOutputIds,RetractOutputIds,ExtendedFeedbackIds,RetractedFeedbackIds,Description +# ControlType: SingleOutput / DualOutput / MultiOutput +# ExtendOutputIds / RetractOutputIds / ExtendedFeedbackIds / RetractedFeedbackIds 支持填写多个 IO 引用,使用分号分隔 +# IO 引用优先使用 Configuration\DeviceIoPoints.csv 中的 Name;若 Id 在全表唯一,也兼容旧 Id 写法 +Name,Module,ControlType,ExtendOutputIds,RetractOutputIds,ExtendedFeedbackIds,RetractedFeedbackIds,Description +WS θ夹紧气缸,WS,SingleOutput,PG.WS.ThetaClampCylAct,,PG.WS.ThetaClampCyl1WorkPos;PG.WS.ThetaClampCyl2WorkPos;PG.WS.ThetaClampCyl3WorkPos;PG.WS.ThetaClampCyl4WorkPos,PG.WS.ThetaClampCyl1HomePos;PG.WS.ThetaClampCyl2HomePos;PG.WS.ThetaClampCyl3HomePos;PG.WS.ThetaClampCyl4HomePos,WS θ 夹紧气缸总动作输出,对应 4 组伸出/缩回反馈 +WS θ刹车压紧气缸,WS,SingleOutput,PG.WS.ThetaBrakePressCylAct,,,,当前 DeviceIoPoints.csv 未配置到位反馈 +Stage 顶升同步气缸,Stage,MultiOutput,PG.Stage.LifterCyl1Act;PG.Stage.LifterCyl2Act,,PG.Stage.LifterCyl1WorkPos;PG.Stage.LifterCyl2WorkPos,PG.Stage.LifterCyl1HomePos;PG.Stage.LifterCyl2HomePos,Stage 顶升气缸1和2同步动作,统一伸出/缩回 diff --git a/MX-PD-盘古 - new/PanGu.DieBonderApp/Configuration/DeviceIoPoints.csv b/MX-PD-盘古 - new/PanGu.DieBonderApp/Configuration/DeviceIoPoints.csv new file mode 100644 index 0000000..d86f236 --- /dev/null +++ b/MX-PD-盘古 - new/PanGu.DieBonderApp/Configuration/DeviceIoPoints.csv @@ -0,0 +1,97 @@ +# Device IO 定义表 +# 列顺序:Id Module Name Type Card StationNo LineNo Enabled DefaultValue IsInverse Description +# Module: 业务模块名(如 SubstrateLoad/ChipLoad/SubstrateOut/ChipUnload) +# Type: Input/Output (也支持 IN/OUT/DI/DO) +# Card: Td/Acs +# StationNo: 台达站号 +# LineNo: 实际接线线标/号码管标识 +# Enabled: 1/0 或 true/false +# DefaultValue: 当 IO 未启用或无法读取时使用的默认状态,1/0 或 true/false +Id,Module,Name,Type,Card,StationNo,LineNo,Enabled,DefaultValue,IsInverse,Description +0,WZ,PG.WZ.StartButton,Input,Td,1,X00100,1,1,0,WZ 启动按钮 +1,WZ,PG.WZ.StopButton,Input,Td,1,X00101,1,1,0,WZ 停止按钮 +2,WZ,PG.WZ.ResetButton,Input,Td,1,X00102,1,1,0,WZ 复位按钮 +3,WZ,PG.WZ.EmergencyStopButton,Input,Td,1,X00103,1,1,0,WZ 急停按钮 +4,WZ,PG.WZ.BlueButton,Input,Td,1,X00104,1,1,0,WZ 蓝色按钮(预留) +5,Stage,PG.Stage.ToolSetterSignal,Input,Td,1,X00105,1,1,0,Stage 对刀信号 +6,Stage,PG.Stage.SubstrateInPlace,Input,Td,1,X00106,1,1,0,Stage 基板到位感应 +7,Stage,PG.Stage.LifterCyl1WorkPos,Input,Td,1,X00107,1,1,0,Stage 顶升气缸1动点 +8,Stage,PG.Stage.LifterCyl1HomePos,Input,Td,1,X00108,1,1,0,Stage 顶升气缸1原点 +9,Stage,PG.Stage.LifterCyl2WorkPos,Input,Td,1,X00109,1,1,0,Stage 顶升气缸2动点 +10,Stage,PG.Stage.LifterCyl2HomePos,Input,Td,1,X00110,1,1,0,Stage 顶升气缸2原点 +11,WS,PG.WS.ThetaClampCyl1WorkPos,Input,Td,1,X00111,1,1,0,WS θ夹紧气缸1动点 +12,WS,PG.WS.ThetaClampCyl1HomePos,Input,Td,1,X00112,1,1,0,WS θ夹紧气缸1原点 +13,WS,PG.WS.ThetaClampCyl2WorkPos,Input,Td,1,X00113,1,1,0,WS θ夹紧气缸2动点 +14,WS,PG.WS.ThetaClampCyl2HomePos,Input,Td,1,X00114,1,1,0,WS θ夹紧气缸2原点 +15,WS,PG.WS.ThetaClampCyl3WorkPos,Input,Td,1,X00115,1,1,0,WS θ夹紧气缸3动点 +0,WS,PG.WS.ThetaClampCyl3HomePos,Input,Td,2,X00200,1,1,0,WS θ夹紧气缸3原点 +1,WS,PG.WS.ThetaClampCyl4WorkPos,Input,Td,2,X00201,1,1,0,WS θ夹紧气缸4动点 +2,WS,PG.WS.ThetaClampCyl4HomePos,Input,Td,2,X00202,1,1,0,WS θ夹紧气缸4原点 +3,WS,PG.WS.ThetaTrayPresentSensor1,Input,Td,2,X00203,1,1,0,WS θ料盘有无感应1 +4,WS,PG.WS.ThetaTrayPresentSensor2,Input,Td,2,X00204,1,1,0,WS θ料盘有无感应2 +5,WS,PG.WS.ThetaTrayPresentSensor3,Input,Td,2,X00205,1,1,0,WS θ料盘有无感应3 +6,WS,PG.WS.ThetaTrayPresentSensor4,Input,Td,2,X00206,1,1,0,WS θ料盘有无感应4 +7,WS,PG.WS.BondHead1InPlace,Input,Td,2,X00207,1,1,0,WS 刺晶头1在位 +8,WS,PG.WS.BondHead2InPlace,Input,Td,2,X00208,1,1,0,WS 刺晶头2在位 +9,WS,PG.WS.BondHead3InPlace,Input,Td,2,X00209,1,1,0,WS 刺晶头3在位 +10,WS,PG.WS.BondHead4InPlace,Input,Td,2,X00210,1,1,0,WS 刺晶头4在位 +11,WEU,PG.WEU.Z11MaterialSensor1,Input,Td,2,X00211,1,1,0,WEU Z11 有无料感应1 +12,WEU,PG.WEU.Z11MaterialSensor2,Input,Td,2,X00212,1,1,0,WEU Z11 有无料感应2 +13,WEU,PG.WEU.Z12MaterialSensor3,Input,Td,2,X00213,1,1,0,WEU Z12 有无料感应3 +14,WEU,PG.WEU.Z12MaterialSensor4,Input,Td,2,X00214,1,1,0,WEU Z12 有无料感应4 +0,CV,PG.CV.UpperInletSensor,Input,Td,3,X00300,1,1,0,CV 上层进料感应 +1,CV,PG.CV.UpperInPlaceSensor,Input,Td,3,X00301,1,1,0,CV 上层到位感应 +2,CV,PG.CV.LowerOutletSensor,Input,Td,3,X00302,1,1,0,CV 下层出料感应 +3,CV,PG.CV.LowerInPlaceSensor,Input,Td,3,X00303,1,1,0,CV 下层到位感应 +4,WZ,PG.WZ.SafetyDoor1Closed,Input,Td,3,X00304,1,1,0,WZ 安全门1关门检测 +5,WZ,PG.WZ.SafetyDoor2Closed,Input,Td,3,X00305,1,1,0,WZ 安全门2关门检测 +6,WZ,PG.WZ.SafetyDoor3Closed,Input,Td,3,X00306,1,1,0,WZ 安全门3关门检测 +7,WZ,PG.WZ.SafetyDoor4Closed,Input,Td,3,X00307,1,1,0,WZ 安全门4关门检测 +8,WZ,PG.WZ.SecurityDoorShield,Input,Td,3,X00308,1,1,0,WZ 安全门屏蔽 +10,General,PG.General.PhaseLossSensor,Input,Td,3,X00310,1,1,0,缺相检测 +11,General,PG.General.SafetyCircuitStatus1,Input,Td,3,X00311,1,1,0,安全回路状态1 +12,General,PG.General.SafetyCircuitStatus2,Input,Td,3,X00312,1,1,0,安全回路状态2 +13,CV,PG.CV.IonWindRodAlarmDetection,Input,Td,3,X00313,1,1,0,CV 离子风棒报警检测 +14,EFEM,PG.EFEM.IonWindRodAlarmDetection1,Input,Td,3,X00314,1,1,0,EFEM离子风棒报警检测1 +15,EFEM,PG.EFEM.IonWindRodAlarmDetection2,Input,Td,3,X00315,1,1,0,EFEM离子风棒报警检测2 +0,AxisZ,PG.AxisZ.Z1GuideRailBrake,Output,Td,4,Y00100,1,1,0,Z1轴导轨抱闸 +1,AxisZ,PG.AxisZ.Z3CameraAirCooling,Output,Td,4,Y00101,1,1,0,Z3相机气冷 +2,AxisZ,PG.AxisZ.Z5CameraAirCooling,Output,Td,4,Y00102,1,1,0,Z5相机气冷 +3,AxisZ,PG.AxisZ.Z10CameraAirCooling,Output,Td,4,Y00103,1,1,0,Z10相机气冷 +4,AxisZ,PG.AxisZ.Z2BondHeadAirCooling,Output,Td,4,Y00104,1,1,0,Z2刺晶头气冷 +5,CV,PG.CV.IonBarAct,Output,Td,4,Y00105,1,1,0,CV 离子风棒 +6,WEU,PG.WEU.IonBarAct1,Output,Td,4,Y00106,1,1,0,WEU离子风棒1 +7,WEU,PG.WEU.IonBarAct2,Output,Td,4,Y00107,1,1,0,WEU离子风棒2 +8,WS,PG.WS.ThetaClampCylAct,Output,Td,4,Y00108,1,1,0,WS θ 夹紧气缸动作 +9,WS,PG.WS.ThetaBrakePressCylAct,Output,Td,4,Y00109,1,1,0,WS θ 刹车压紧气缸动作 +10,Stage,PG.Stage.LifterCyl1Act,Output,Td,4,Y00110,1,1,0,Stage 顶升气缸1动作 +11,Stage,PG.Stage.LifterCyl2Act,Output,Td,4,Y00111,1,1,0,Stage 顶升气缸2动作 +0,WZ,PG.WZ.StartButtonLight,Output,Td,5,Y00200,1,1,0,WZ 启动按钮灯 +1,WZ,PG.WZ.StopButtonLight,Output,Td,5,Y00201,1,1,0,WZ 停止按钮灯 +2,WZ,PG.WZ.ResetButtonLight,Output,Td,5,Y00202,1,1,0,WZ 复位按钮灯 +3,WZ,PG.WZ.BlueButtonLight,Output,Td,5,Y00203,1,1,0,WZ 蓝色按钮灯 +4,WZ,PG.WZ.WorkLight1,Output,Td,5,Y00204,1,1,0,WZ 照明灯1 +6,EFEM,PG.EFEM.WorkLight1,Output,Td,5,Y00206,1,1,0,EFEM 照明灯1 +8,WZ,PG.WZ.StackLightRed,Output,Td,5,Y00208,1,1,0,WZ 四色灯-红 +9,WZ,PG.WZ.StackLightYellow,Output,Td,5,Y00209,1,1,0,WZ 四色灯-黄 +10,WZ,PG.WZ.StackLightGreen,Output,Td,5,Y00210,1,1,0,WZ 四色灯-绿 +11,WZ,PG.WZ.StackLightBlue,Output,Td,5,Y00211,1,1,0,WZ 四色灯-蓝 +12,WZ,PG.WZ.BuzzerAct,Output,Td,5,Y00212,1,1,0,WZ 蜂鸣器 +0,Stage,PG.Stage.BreakingTheVacuum1,Output,Td,6,Y00300,1,1,0,Stage 破真空1 +1,Stage,PG.Stage.BreakingTheVacuum2,Output,Td,6,Y00301,1,1,0,STAGE 破真空2 +2,Stage,PG.Stage.BreakingTheVacuum3,Output,Td,6,Y00302,1,1,0,STAGE 破真空3 +3,Stage,PG.Stage.BreakingTheVacuum4,Output,Td,6,Y00303,1,1,0,STAGE 破真空4 +4,WEU,PG.WEU.TrayBreakVacuum1,Output,Td,6,Y00304,1,1,0,WEU 料盘破真空1 +5,WEU,PG.WEU.TrayBreakVacuum2,Output,Td,6,Y00305,1,1,0,WEU 料盘破真空2 +6,AxisZ,PG.AxisZ.Z2BondHeadBreakVacuum,Output,Td,6,Y00306,1,1,0,PHS Z2 刺晶头破真空 +7,Stage,PG.Stage.Vacuum1,Output,Td,6,Y00307,1,1,0,STAGE 吸真空1 +8,Stage,PG.Stage.Vacuum2,Output,Td,6,Y00308,1,1,0,STAGE 吸真空2 +9,Stage,PG.Stage.Vacuum3,Output,Td,6,Y00309,1,1,0,STAGE 吸真空3 +10,Stage,PG.Stage.Vacuum4,Output,Td,6,Y00310,1,1,0,STAGE 吸真空4 +11,WEU,PG.WEU.TrayVacuum1,Output,Td,6,Y00311,1,1,0,WEU 料盘吸真空1 +12,WEU,PG.WEU.TrayVacuum2,Output,Td,6,Y00312,1,1,0,WEU 料盘吸真空2 +13,AxisZ,PG.AxisZ.Z2BondHeadVacuum,Output,Td,6,Y00313,1,1,0,PHS Z2 刺晶头吸真空 +1,WZ,PG.WZ.SafetyDoor1Open,Output,Td,7,Y00401,1,1,0,WZ 安全门1打开 +2,WZ,PG.WZ.SafetyDoor2Open,Output,Td,7,Y00402,1,1,0,WZ 安全门2打开 +3,WZ,PG.WZ.SafetyDoor3Open,Output,Td,7,Y00402,1,1,0,WZ 安全门3打开 +4,WZ,PG.WZ.SafetyDoor4Open,Output,Td,7,Y00403,1,1,0,WZ 安全门4打开 \ No newline at end of file diff --git a/MX-PD-盘古 - new/PanGu.DieBonderApp/Configuration/DeviceIoPoints1.csv b/MX-PD-盘古 - new/PanGu.DieBonderApp/Configuration/DeviceIoPoints1.csv new file mode 100644 index 0000000..6d5ff01 --- /dev/null +++ b/MX-PD-盘古 - new/PanGu.DieBonderApp/Configuration/DeviceIoPoints1.csv @@ -0,0 +1,97 @@ +# Device IO ,,,,,,,,,, +"# ˳Id Module Name Type Card StationNo LineNo Enabled DefaultValue IsInverse Description",,,,,,,,,, +# Module: ҵģ SubstrateLoad/ChipLoad/SubstrateOut/ChipUnload,,,,,,,,,, +# Type: Input/Output (Ҳ֧ IN/OUT/DI/DO),,,,,,,,,, +# Card: Td/Acs,,,,,,,,,, +# StationNo: ̨վ,,,,,,,,,, +# LineNo: ʵʽ߱/ܱʶ,,,,,,,,,, +# Enabled: 1/0 true/false,,,,,,,,,, +# DefaultValue: IO δû޷ȡʱʹõĬ״̬1/0 true/false,,,,,,,,,, +Id,Module,Name,Type,Card,StationNo,LineNo,Enabled,DefaultValue,IsInverse,Description +0,WZ,PG.WZ.StartButton,Input,Td,1,X00100,1,1,0,WZ ť +1,WZ,PG.WZ.StopButton,Input,Td,1,X00101,1,1,0,WZ ֹͣť +2,WZ,PG.WZ.ResetButton,Input,Td,1,X00102,1,1,0,WZ λť +3,WZ,PG.WZ.EmergencyStopButton,Input,Td,1,X00103,1,1,0,WZ ͣť +4,WZ,PG.WZ.BlueButton,Input,Td,1,X00104,1,1,0,WZ ɫťԤ +5,Stage,PG.Stage.ToolSetterSignal,Input,Td,1,X00105,1,1,0,Stage Եź +6,Stage,PG.Stage.SubstrateInPlace,Input,Td,1,X00106,1,1,0,Stage 嵽λӦ +7,Stage,PG.Stage.LifterCyl1WorkPos,Input,Td,1,X00107,1,1,0,Stage 1 +8,Stage,PG.Stage.LifterCyl1HomePos,Input,Td,1,X00108,1,1,0,Stage 1ԭ +9,Stage,PG.Stage.LifterCyl2WorkPos,Input,Td,1,X00109,1,1,0,Stage 2 +10,Stage,PG.Stage.LifterCyl2HomePos,Input,Td,1,X00110,1,1,0,Stage 2ԭ +11,WS,PG.WS.ThetaClampCyl1WorkPos,Input,Td,1,X00111,1,1,0,WS н1 +12,WS,PG.WS.ThetaClampCyl1HomePos,Input,Td,1,X00112,1,1,0,WS н1ԭ +13,WS,PG.WS.ThetaClampCyl2WorkPos,Input,Td,1,X00113,1,1,0,WS н2 +14,WS,PG.WS.ThetaClampCyl2HomePos,Input,Td,1,X00114,1,1,0,WS н2ԭ +15,WS,PG.WS.ThetaClampCyl3WorkPos,Input,Td,1,X00115,1,1,0,WS н3 +0,WS,PG.WS.ThetaClampCyl3HomePos,Input,Td,2,X00200,1,1,0,WS н3ԭ +1,WS,PG.WS.ThetaClampCyl4WorkPos,Input,Td,2,X00201,1,1,0,WS н4 +2,WS,PG.WS.ThetaClampCyl4HomePos,Input,Td,2,X00202,1,1,0,WS н4ԭ +3,WS,PG.WS.ThetaTrayPresentSensor1,Input,Td,2,X00203,1,1,0,WS ޸Ӧ1 +4,WS,PG.WS.ThetaTrayPresentSensor2,Input,Td,2,X00204,1,1,0,WS ޸Ӧ2 +5,WS,PG.WS.ThetaTrayPresentSensor3,Input,Td,2,X00205,1,1,0,WS ޸Ӧ3 +6,WS,PG.WS.ThetaTrayPresentSensor4,Input,Td,2,X00206,1,1,0,WS ޸Ӧ4 +7,WS,PG.WS.BondHead1InPlace,Input,Td,2,X00207,1,1,0,WS ̾ͷ1λ +8,WS,PG.WS.BondHead2InPlace,Input,Td,2,X00208,1,1,0,WS ̾ͷ2λ +9,WS,PG.WS.BondHead3InPlace,Input,Td,2,X00209,1,1,0,WS ̾ͷ3λ +10,WS,PG.WS.BondHead4InPlace,Input,Td,2,X00210,1,1,0,WS ̾ͷ4λ +11,WEU,PG.WEU.Z11MaterialSensor1,Input,Td,2,X00211,1,1,0,WEU Z11 ϸӦ1 +12,WEU,PG.WEU.Z11MaterialSensor2,Input,Td,2,X00212,1,1,0,WEU Z11 ϸӦ2 +13,WEU,PG.WEU.Z12MaterialSensor3,Input,Td,2,X00213,1,1,0,WEU Z12 ϸӦ3 +14,WEU,PG.WEU.Z12MaterialSensor4,Input,Td,2,X00214,1,1,0,WEU Z12 ϸӦ4 +0,CV,PG.CV.UpperInletSensor,Input,Td,3,X00300,1,1,0,CV ϲϸӦ +1,CV,PG.CV.UpperInPlaceSensor,Input,Td,3,X00301,1,1,0,CV ϲ㵽λӦ +2,CV,PG.CV.LowerOutletSensor,Input,Td,3,X00302,1,1,0,CV ²ϸӦ +3,CV,PG.CV.LowerInPlaceSensor,Input,Td,3,X00303,1,1,0,CV ²㵽λӦ +4,WZ,PG.WZ.SafetyDoor1Closed,Input,Td,3,X00304,1,1,0,WZ ȫ1ż +5,WZ,PG.WZ.SafetyDoor2Closed,Input,Td,3,X00305,1,1,0,WZ ȫ2ż +6,WZ,PG.WZ.SafetyDoor3Closed,Input,Td,3,X00306,1,1,0,WZ ȫ3ż +7,WZ,PG.WZ.SafetyDoor4Closed,Input,Td,3,X00307,1,1,0,WZ ȫ4ż +8,WZ,PG.WZ.SecurityDoorShield,Input,Td,3,X00308,1,1,0,WZ ȫ +10,General,PG.General.PhaseLossSensor,Input,Td,3,X00310,1,1,0,ȱ +11,General,PG.General.SafetyCircuitStatus1,Input,Td,3,X00311,1,1,0,ȫ·״̬1 +12,General,PG.General.SafetyCircuitStatus2,Input,Td,3,X00312,1,1,0,ȫ·״̬2 +13,CV,PG.CV.IonWindRodAlarmDetection,Input,Td,3,X00313,1,1,0,CV ӷ +14,EFEM,PG.EFEM.IonWindRodAlarmDetection1,Input,Td,3,X00314,1,1,0,EFEMӷ1 +15,EFEM,PG.EFEM.IonWindRodAlarmDetection2,Input,Td,3,X00315,1,1,0,EFEMӷ2 +0,AxisZ,PG.AxisZ.Z1GuideRailBrake,Output,Td,4,Y00100,1,1,0,Z1ᵼ챧բ +1,AxisZ,PG.AxisZ.Z3CameraAirCooling,Output,Td,4,Y00101,1,1,0,Z3 +2,AxisZ,PG.AxisZ.Z5CameraAirCooling,Output,Td,4,Y00102,1,1,0,Z5 +3,AxisZ,PG.AxisZ.Z10CameraAirCooling,Output,Td,4,Y00103,1,1,0,Z10 +4,AxisZ,PG.AxisZ.Z2BondHeadAirCooling,Output,Td,4,Y00104,1,1,0,Z2̾ͷ +5,CV,PG.CV.IonBarAct,Output,Td,4,Y00105,1,1,0,CV ӷ +6,WEU,PG.WEU.IonBarAct1,Output,Td,4,Y00106,1,1,0,WEUӷ1 +7,WEU,PG.WEU.IonBarAct2,Output,Td,4,Y00107,1,1,0,WEUӷ2 +8,WS,PG.WS.ThetaClampCylAct,Output,Td,4,Y00108,1,1,0,WS н׶ +9,WS,PG.WS.ThetaBrakePressCylAct,Output,Td,4,Y00109,1,1,0,WS ɲѹ׶ +10,Stage,PG.Stage.LifterCyl1Act,Output,Td,4,Y00110,1,1,0,Stage 1 +11,Stage,PG.Stage.LifterCyl2Act,Output,Td,4,Y00111,1,1,0,Stage 2 +0,WZ,PG.WZ.StartButtonLight,Output,Td,5,Y00200,1,1,0,WZ ť +1,WZ,PG.WZ.StopButtonLight,Output,Td,5,Y00201,1,1,0,WZ ֹͣť +2,WZ,PG.WZ.ResetButtonLight,Output,Td,5,Y00202,1,1,0,WZ λť +3,WZ,PG.WZ.BlueButtonLight,Output,Td,5,Y00203,1,1,0,WZ ɫť +4,WZ,PG.WZ.WorkLight1,Output,Td,5,Y00204,1,1,0,WZ 1 +6,EFEM,PG.EFEM.WorkLight1,Output,Td,5,Y00206,1,1,0,EFEM 1 +8,WZ,PG.WZ.StackLightRed,Output,Td,5,Y00208,1,1,0,WZ ɫ- +9,WZ,PG.WZ.StackLightYellow,Output,Td,5,Y00209,1,1,0,WZ ɫ- +10,WZ,PG.WZ.StackLightGreen,Output,Td,5,Y00210,1,1,0,WZ ɫ- +11,WZ,PG.WZ.StackLightBlue,Output,Td,5,Y00211,1,1,0,WZ ɫ- +12,WZ,PG.WZ.BuzzerAct,Output,Td,5,Y00212,1,1,0,WZ +0,Stage,PG.Stage.BreakingTheVacuum1,Output,Td,6,Y00300,1,1,0,STAGE 1 +1,Stage,PG.Stage.BreakingTheVacuum2,Output,Td,6,Y00301,1,1,0,STAGE 2 +2,Stage,PG.Stage.BreakingTheVacuum3,Output,Td,6,Y00302,1,1,0,STAGE 3 +3,Stage,PG.Stage.BreakingTheVacuum4,Output,Td,6,Y00303,1,1,0,STAGE 4 +4,WEU,PG.WEU.TrayBreakVacuum1,Output,Td,6,Y00304,1,1,0,WEU 1 +5,WEU,PG.WEU.TrayBreakVacuum2,Output,Td,6,Y00305,1,1,0,WEU 2 +6,AxisZ,PG.AxisZ.Z2BondHeadBreakVacuum,Output,Td,6,Y00306,1,1,0,PHS Z2 ̾ͷ +7,Stage,PG.Stage.Vacuum1,Output,Td,6,Y00307,1,1,0,STAGE 1 +8,Stage,PG.Stage.Vacuum2,Output,Td,6,Y00308,1,1,0,STAGE 2 +9,Stage,PG.Stage.Vacuum3,Output,Td,6,Y00309,1,1,0,STAGE 3 +10,Stage,PG.Stage.Vacuum4,Output,Td,6,Y00310,1,1,0,STAGE 4 +11,WEU,PG.WEU.TrayVacuum1,Output,Td,6,Y00311,1,1,0,WEU 1 +12,WEU,PG.WEU.TrayVacuum2,Output,Td,6,Y00312,1,1,0,WEU 2 +13,AxisZ,PG.AxisZ.Z2BondHeadVacuum,Output,Td,6,Y00313,1,1,0,PHS Z2 ̾ͷ +1,WZ,PG.WZ.SafetyDoor1Open,Output,Td,7,Y00400,1,1,0,WZ ȫ1 +2,WZ,PG.WZ.SafetyDoor2Open,Output,Td,7,Y00401,1,1,0,WZ ȫ2 +3,WZ,PG.WZ.SafetyDoor3Open,Output,Td,7,Y00402,1,1,0,WZ ȫ3 +4,WZ,PG.WZ.SafetyDoor4Open,Output,Td,7,Y00403,1,1,0,WZ ȫ4 diff --git a/MX-PD-盘古 - new/PanGu.DieBonderApp/Configuration/FlowStageMapping.json b/MX-PD-盘古 - new/PanGu.DieBonderApp/Configuration/FlowStageMapping.json new file mode 100644 index 0000000..bfd9a30 --- /dev/null +++ b/MX-PD-盘古 - new/PanGu.DieBonderApp/Configuration/FlowStageMapping.json @@ -0,0 +1,130 @@ +{ + "Rules": [ + { + "WorkflowName": "SubstrateLoadFlow", + "ParentActivityName": "*", + "ActivityName": "*", + "Stage": 0, + "DisplayFlowName": "SubstrateLoadFlow" + }, + { + "WorkflowName": "SubstratePositionFlow", + "ParentActivityName": "*", + "ActivityName": "*", + "Stage": 1, + "DisplayFlowName": "SubstratePositionFlow" + }, + { + "WorkflowName": "WaferAngleAdjustmentFlow", + "ParentActivityName": "*", + "ActivityName": "*", + "Stage": 1, + "DisplayFlowName": "WaferAngleAdjustmentFlow" + }, + { + "WorkflowName": "DiePositionFlow", + "ParentActivityName": "*", + "ActivityName": "*", + "Stage": 1, + "DisplayFlowName": "DiePositionFlow" + }, + { + "WorkflowName": "DieTransferFlow", + "ParentActivityName": "*", + "ActivityName": "*", + "Stage": 2, + "DisplayFlowName": "DieTransferFlow" + }, + { + "WorkflowName": "DieRecheckFlow", + "ParentActivityName": "*", + "ActivityName": "*", + "Stage": 3, + "DisplayFlowName": "DieRecheckFlow" + }, + { + "WorkflowName": "SubstrateUnloadFlow", + "ParentActivityName": "*", + "ActivityName": "*", + "Stage": 4, + "DisplayFlowName": "SubstrateUnloadFlow" + }, + { + "WorkflowName": "AutoProduction", + "ParentActivityName": "SubstrateLoadFlow", + "ActivityName": "*", + "Stage": 0, + "DisplayFlowName": "SubstrateLoadFlow" + }, + { + "WorkflowName": "AutoProduction", + "ParentActivityName": "DieAlignFlow", + "ActivityName": "*SubstratePosition*", + "Stage": 1, + "DisplayFlowName": "SubstratePositionFlow" + }, + { + "WorkflowName": "AutoProduction", + "ParentActivityName": "DieAlignFlow", + "ActivityName": "WaferAngleAdjustmentFlow", + "Stage": 1, + "DisplayFlowName": "WaferAngleAdjustmentFlow" + }, + { + "WorkflowName": "AutoProduction", + "ParentActivityName": "DieAlignFlow", + "ActivityName": "DiePositionFlow", + "Stage": 1, + "DisplayFlowName": "DiePositionFlow" + }, + { + "WorkflowName": "AutoProduction", + "ParentActivityName": "DieAlignFlow", + "ActivityName": "*", + "Stage": 1, + "DisplayFlowName": "SubstratePositionFlow" + }, + { + "WorkflowName": "AutoProduction", + "ParentActivityName": "DieBondFlow", + "ActivityName": "*", + "Stage": 2, + "DisplayFlowName": "DieTransferFlow" + }, + { + "WorkflowName": "AutoProduction", + "ParentActivityName": "InspectFlow", + "ActivityName": "*", + "Stage": 3, + "DisplayFlowName": "DieRecheckFlow" + }, + { + "WorkflowName": "AutoProduction", + "ParentActivityName": "SubstrateUnloadFlow", + "ActivityName": "*", + "Stage": 4, + "DisplayFlowName": "SubstrateUnloadFlow" + }, + { + "WorkflowName": "AutoProduction", + "ParentActivityName": "DieAlignFlow", + "ActivityName": "SubstratePositionFlow", + "Stage": 1, + "DisplayFlowName": "SubstratePositionFlow" + }, + { + "WorkflowName": "AutoProduction", + "ParentActivityName": "DieBondFlow", + "ActivityName": "DieTransferFlow", + "Stage": 2, + "DisplayFlowName": "DieTransferFlow" + }, + { + "WorkflowName": "AutoProduction", + "ParentActivityName": "InspectFlow", + "ActivityName": "DieRecheckFlow", + "Stage": 3, + "DisplayFlowName": "DieRecheckFlow" + } + ] +} \ No newline at end of file diff --git a/MX-PD-盘古 - new/PanGu.DieBonderApp/Configuration/Layout.xml b/MX-PD-盘古 - new/PanGu.DieBonderApp/Configuration/Layout.xml new file mode 100644 index 0000000..6c458ad --- /dev/null +++ b/MX-PD-盘古 - new/PanGu.DieBonderApp/Configuration/Layout.xml @@ -0,0 +1,30 @@ + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + +